对于中小型公司来说,什么是最合适的加密? '该数据库
本文关键字:加密 数据库 公司 中小型 什么 | 更新日期: 2023-09-27 18:06:14
我想实现加密,因为有多个人可以访问数据库,我的公司希望在我的应用程序中存储人员(敏感)信息。为了创建一些分离和安全性,我想理想地使用他们选择的"密钥"来加密一个SQL表中的数据。
我知道自己这样做,我会错过一个技巧和尝试和测试可能是最好的,特别是对于我们这样规模的公司,我们不需要担心太多的黑客,因为数据库是不可外部访问的。刚好够把感兴趣的人挡在外面。
我想知道什么级别的安全是合适的,我也有点迷失了什么,甚至谷歌找到什么样的加密可能在第三方插件我需要使用,因为他们都想销售他们的产品,他们都会说他们自己的是伟大的?
我能找到的大多数其他问题和建议的"类似问题"都谈到了数据传输加密,哈希或ASP。净
所有的安全性实际上都是关于提高标准和可用性的权衡。对于加密,这里有很多选项,但它实际上都归结为密钥管理。
谁有解密的密钥?
它们是如何存储的?
对你的应用程序数据的暴力攻击(比如他们通过拦截你的联邦快递到铁山获得加密的SQL Server数据库的备份磁带)比对密钥管理系统的内部攻击更不可能-例如员工或开发人员修改程序来解密和转储数据。
由于应用程序通常必须随时向授权用户解密这些数据,因此我可能首先关注敏感列的可见性以及允许访问它们的角色,然后再考虑对它们进行加密。
SQL Server只提供对数据的透明加密以及对连接的加密。如果用户对表具有SELECT *
访问权限,那么这是没有用的。在SQL Server不知情的情况下在列中加密它可能会有问题。例如,如果一列是工资数据,这是敏感的,如果你在一列中加密它,你不能只运行SELECT Employee, SUM(Pay) GROUP BY Employee
因此,首先我要确保您已经确定了应用程序中的用户和角色,检查了他们拥有的访问权限,并确保所有到数据库的连接都使用适当的角色。
我个人建议使用AES,因为它很容易实现,而且它是敏感的个人数据,可以提供足够的加密,不像DES这样的东西。
如果您想从技术上了解AES的工作原理,本文将深入介绍它:http://msdn.microsoft.com/en-us/magazine/cc164055.aspx以及附带的基本示例:http://msdn.microsoft.com/en-us/magazine/cc164846.aspx
如何实现它的一个非常干净的例子是在这里:http://www.obviex.com/samples/Code.aspx?Source=EncryptionCS&Title=Symmetric%20Key%20Encryption&Lang=C%23
示例简化(防止链接失效)
using System;
using System.IO;
using System.Security.Cryptography;
namespace RijndaelManaged_Examples
{
class RijndaelMemoryExample
{
public static void Main()
{
try
{
string original = "Here is some data to encrypt!";
// Create a new instance of the RijndaelManaged
// class. This generates a new key and initialization
// vector (IV).
RijndaelManaged myRijndael = new RijndaelManaged();
// Encrypt the string to an array of bytes.
byte[] encrypted = encryptStringToBytes_AES(original, myRijndael.Key, myRijndael.IV);
// Decrypt the bytes to a string.
string roundtrip = decryptStringFromBytes_AES(encrypted, myRijndael.Key, myRijndael.IV);
//Display the original data and the decrypted data.
Console.WriteLine("Original: {0}", original);
Console.WriteLine("Round Trip: {0}", roundtrip);
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV)
{
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the streams used
// to encrypt to an in memory
// array of bytes.
MemoryStream msEncrypt = null;
CryptoStream csEncrypt = null;
StreamWriter swEncrypt = null;
// Declare the RijndaelManaged object
// used to encrypt the data.
RijndaelManaged aesAlg = null;
try
{
// Create a RijndaelManaged object
// with the specified key and IV.
aesAlg = new RijndaelManaged();
aesAlg.Key = Key;
aesAlg.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for encryption.
msEncrypt = new MemoryStream();
csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
swEncrypt = new StreamWriter(csEncrypt);
//Write all data to the stream.
swEncrypt.Write(plainText);
}
finally
{
// Clean things up.
// Close the streams.
if(swEncrypt != null)
swEncrypt.Close();
if (csEncrypt != null)
csEncrypt.Close();
if (msEncrypt != null)
msEncrypt.Close();
// Clear the RijndaelManaged object.
if (aesAlg != null)
aesAlg.Clear();
}
// Return the encrypted bytes from the memory stream.
return msEncrypt.ToArray();
}
static string decryptStringFromBytes_AES(byte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// TDeclare the streams used
// to decrypt to an in memory
// array of bytes.
MemoryStream msDecrypt = null;
CryptoStream csDecrypt = null;
StreamReader srDecrypt = null;
// Declare the RijndaelManaged object
// used to decrypt the data.
RijndaelManaged aesAlg = null;
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
try
{
// Create a RijndaelManaged object
// with the specified key and IV.
aesAlg = new RijndaelManaged();
aesAlg.Key = Key;
aesAlg.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for decryption.
msDecrypt = new MemoryStream(cipherText);
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
srDecrypt = new StreamReader(csDecrypt);
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
finally
{
// Clean things up.
// Close the streams.
if (srDecrypt != null)
srDecrypt.Close();
if (csDecrypt != null)
csDecrypt.Close();
if (msDecrypt != null)
msDecrypt.Close();
// Clear the RijndaelManaged object.
if (aesAlg != null)
aesAlg.Clear();
}
return plaintext;
}
}
}
混乱信息可以用对称(Rijndael)密钥完成,但我不知道使用SQL更新的应用程序的性能提高了多少。
Symmetric (Rijndael) Key