使用C#和SQL加密和安全

Mis*_*ssy 8 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**))
Run Code Online (Sandbox Code Playgroud)

然后我使用密钥使用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.
Run Code Online (Sandbox Code Playgroud)

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

问题是:这是否足以保证数据不被解密,如果现在,为什么不,以及您可能建议的更改?

Luk*_*uke 5

这里的问题是,任何能够获得该文件的人都很有可能获得数据库中的数据(包括密钥).一旦数据被泄露,更改密钥的频率并不重要,因为攻击者将使用与其匹配的密钥加密文件的副本.

此问题的常见解决方案是使用外部硬件安全模块TPM之类的东西.

这是一个非常有用且相关的帖子,列举了几个选项.