使用 C# 和 SQL 进行加密和安全

标签 encryption cryptography

我看过这些例子,但我希望其他程序员可以运行它。为了在我的窗口窗体应用程序中进行加密,我生成了两个随机数并将它们保存在 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/

相关文章:

iOS CryptoSwift AES 加密到 Python 解密有效 - 但不是相反

javascript - 如何在 chrome 中使用 SubtleCrypto(window.crypto.subtle 未定义)

C# - 使用 RSA 加密和解密数据

php - 在 PHP 中取消加密/重新加密 ColdFusion 加密的字符串

java - 将图像(png)转换为字符串然后加密图像

javascript - AES 解密在 forge 中失败,但在 crypto-js 中有效

hash - 强制使用复杂密码 "more important"比加盐好吗?

node.js - Node JS 加密密码 aes 256 最大数据大小

java - 如何从 Android studio 中的 TextView 解码 RSA 公钥(在 java 中)

security - 找不到 Java 安全类