通过数据库传递密码如何使其安全

时间:2015-08-10 08:34:41

标签: c# sql sql-server security

我正在处理已在多台服务器上运行的应用程序。其中一个服务器处理输入,其他服务器执行它。由于公司政策,一切都必须通过数据库,不允许实例之间的套接字。

现在这对所有事情都很好,但有一件让我担心的是密码。我目前正在实现一些需要用户密码才能以纯文本形式到达其中一个应用程序的东西。现在我明白这永远不会100%安全,但我如何将风险降至最低?目前我计划将pw放入数据库并在数据库到达后从数据库中擦除它。日志每天删除一次。我怎样才能明智地改善这种安全性呢?

3 个答案:

答案 0 :(得分:5)

您可以使用此方法加密密码:

     public string Encrypt(string stringToEncrypt, string SEncryptionKey)
        {
                key = System.Text.Encoding.UTF8.GetBytes(SEncryptionKey);
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                return Convert.ToBase64String(ms.ToArray());              
        }

使用:

  private byte[] key = { };
  private byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };

然后你可以在数据库中插入

 password = ...
 password = Encrypt(password.Trim(), "r0b1nr0y");

// Insert in db

并且对于解密,您可以使用此方法:

public string Decrypt(string stringToDecrypt, string sEncryptionKey)
{
        byte[] inputByteArray = new byte[stringToDecrypt.Length + 1];
        key = System.Text.Encoding.UTF8.GetBytes(sEncryptionKey);
        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
        inputByteArray = Convert.FromBase64String(stringToDecrypt);
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write);
        cs.Write(inputByteArray, 0, inputByteArray.Length);
        cs.FlushFinalBlock();
        System.Text.Encoding encoding = System.Text.Encoding.UTF8;
        return encoding.GetString(ms.ToArray());
}

答案 1 :(得分:1)

如果无法对密码进行哈希处理,因为您需要将密码作为纯文本(我猜测您的问题),那么您可以存储在列中加密的密码。 不同服务器上的所有应用程序都需要在配置中共享解密密钥。

顺便说一下:我还会使用加密的SQL连接来防止嗅探。

答案 2 :(得分:0)

您可以使用HASHBYTES()返回所提供输入的哈希值,在您的案例密码中。

 SELECT HashBytes('SHA1', password_field);

不是将密码作为纯文本传递,而是将此哈希值传递给您的服务器;这更加安全。