【问题标题】:Encryption and Security with C# and SQL使用 C# 和 SQL 进行加密和安全性
【发布时间】:2018-03-14 12:23:06
【问题描述】:

我已经看过这些示例,但我希望其他程序员也能运行它。对于我的窗体应用程序中的加密,我生成了两个随机数并将它们保存在 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**))

然后我使用密钥使用 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.

为了执行解密,需要用于加密文件的两个密钥。可以通过需要两个经过身份验证的用户的软件进行解密。钥匙每天都在变化。数据和数据库在物理上是足够安全的。密钥表位于与证书不同的数据库中。

问题是:这是否足以保护数据以防止被轻易解密,如果现在,为什么不这样做?您可能会建议哪些更改?

【问题讨论】:

    标签: encryption cryptography


    【解决方案1】:

    这里的问题是,任何能够获取文件的人也很可能能够获取数据库中的数据(包括密钥)。一旦数据遭到破坏,您更改密钥的频率就无关紧要了,因为攻击者将拥有使用与其匹配的密钥加密的文件副本。

    此问题的常见解决方案是使用外部Hardware Security Module 或类似TPM 的东西。

    Here is a very useful and related post 列举了几个选项。

    【讨论】:

    • 感谢您的反馈。密钥表和证书位于两个不同的数据库中。这是更好的解决方案吗?
    • @Missy 如果两个数据库共享帐户/密码,那就再好不过了。如果他们有不同的凭据,那会稍微好一些。您可能需要认真考虑使用 TPM 或 USB 设备。我真的相信这将是解决您的问题的正确方法。
    【解决方案2】:

    根据其他人的建议,您可以将密钥存储在 USB 或网络共享上。但是,如果在网络共享上,您可能需要将服务登录更改为有权访问网络共享的帐户。

    【讨论】:

    • 如果您决定使用网络共享,请确保通过 UNC 而不是驱动器号指定它,因为服务将无权访问该驱动器映射。
    • 将密钥放在网络共享上并不比将其放在另一台服务器上的数据库中更安全。
    【解决方案3】:

    “对称密钥”可能是这里的一个问题。它们类似于 xor 操作,相同的密钥用于加密和解密。

    对于“更酷”的方法,请改用 ASYMMETRIC 密钥,然后数据库可以保留“如何加密”的一半,而您的应用程序可以保留“如何解密”的一半。这需要付出很多努力,但“即使是 DBA 也看不到机密数据”是一个很酷的功能。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2021-01-27
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多