使用C#在SQL Server数据库中存储敏感数据

时间:2014-08-13 14:37:59

标签: c# sql sql-server encryption

我正在使用C#中的Winforms应用程序来访问员工SSN。我们将数据存储在SQL Server数据库中。显然,我们不能将数字以明文形式存储在数据库中。我们需要以某种加密格式存储它们。

以加密方式存储数据但允许我的应用程序解密数据的最佳方法是什么?

重要的是要注意,这是一个内部应用程序,没有数据将通过互联网传输。

2 个答案:

答案 0 :(得分:1)

您可以尝试MSDN加密服务http://msdn.microsoft.com/en-us/library/system.security.cryptography%28v=vs.110%29.aspx,例如:

使用System.Security.Cryptography;

    private string Crypt(string s_Data, bool b_Encrypt)
    {
        string s_Password = "... your password ...";
        byte[] u8_Salt = new byte[] { 0x26, 0x19, 0x81, 0x4E, 0xA0, 0x6D, 0x95, 0x34, 0x26, 0x75, 0x64, 0x05, 0xF6 };

        PasswordDeriveBytes i_Pass = new PasswordDeriveBytes(s_Password, u8_Salt);

        Rijndael i_Alg = Rijndael.Create();
        i_Alg.Key = i_Pass.GetBytes(32);
        i_Alg.IV = i_Pass.GetBytes(16);

        ICryptoTransform i_Trans = (b_Encrypt) ? i_Alg.CreateEncryptor() : i_Alg.CreateDecryptor();

        MemoryStream i_Mem = new MemoryStream();
        CryptoStream i_Crypt = new CryptoStream(i_Mem, i_Trans, CryptoStreamMode.Write);

        byte[] u8_Data;
        if (b_Encrypt) { u8_Data = Encoding.Unicode.GetBytes(s_Data); }
        else
        {
            try { u8_Data = Convert.FromBase64String(s_Data); }
            catch { return null; }
        }

        try
        {
            i_Crypt.Write(u8_Data, 0, u8_Data.Length);
            i_Crypt.Close();
        }
        catch { return string.Empty; }

        if (b_Encrypt) return Convert.ToBase64String(i_Mem.ToArray());
        else return Encoding.Unicode.GetString(i_Mem.ToArray());
    }

答案 1 :(得分:0)

您应该对数据进行双重加密,尤其是如果您在同一数据表中也有名称。上述方法将从代码的角度保护数据,但如果您的员工中有恶意开发人员,他们很容易获取数据。

除了user3806621的解决方案之外,您还应该查看SQL服务器上的加密 - 请参阅此链接MSDN article

但是,根据您的地理位置,您可能还会遇到许多数据保护问题。