我看过这些例子,但我希望其他程序员可以运行它。为了在我的窗口窗体应用程序中进行加密,我生成了两个随机数并将它们保存在 SQL Server 表中,如下所示:
OPEN SYMMETRIC KEY SymmetricKeyName DECRYPTION BY CERTIFICATE CertificateName;
insert into keyfile(encrypted_key1, encrypted_key2) values
(EncryptByKey(Key_GUID('SymmetricKeyName'), **Key1**),
EncryptByKey(Key_GUID('SymmetricKeyName'), **Key2**))
然后我使用 key 使用 AES-256 加密文件,如下所示:
var key = new Rfc2898DeriveBytes(**Key1, Key2**, 1000);
RijndaelManaged AES = new RijndaelManaged();
AES.KeySize = 256;
AES.BlockSize = 128;
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Padding = PaddingMode.Zeros;
AES.Mode = CipherMode.CBC;
using (var output = File.Create(outputFile))
{
using (var crypto = new CryptoStream(output, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
using (var input = File.OpenRead(inputFile))
{
input.CopyTo(crypto);
}
}
}
etc.
为了执行解密,用于加密文件的两个 key 都是必需的。可以通过需要两个经过身份验证的用户的软件进行解密。 key 每天都在变化。数据和数据库在物理上是足够安全的。 key 表位于与证书不同的数据库中。
问题是:这是否足以保护数据以使其不易被解密,如果现在,为什么不这样做,您可能会建议哪些更改?
最佳答案
这里的问题是,任何能够获得该文件的人也很有可能获得数据库中的数据(包括 key )。一旦数据遭到破坏,更改 key 的频率就无关紧要,因为攻击者会拥有一份使用匹配 key 加密的文件副本。
此问题的常见解决方案是使用外部 Hardware Security Module或类似 TPM .
Here is a very useful and related post列举了几个选项。
关于使用 C# 和 SQL 进行加密和安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49277707/