如何加密密码列

Boo*_*man 7 sql-server encryption sql-server-2008

我在SQL Server 2008 r2中有用户表.什么都没有加密,但我想至少加密密码,直到应用程序准备好,将更好地处理这个.我可以这样做吗?手动使密码加密.

Rus*_*ell 10

您可以使用SQL Server加密列(请参阅:http://msdn.microsoft.com/en-us/library/ms179331.aspx进行演练).

您还可以使用从服务器本身发出的密钥.

使用它的风险是,如果您必须进行数据恢复并将数据库移动到其他服务器,则无法解密该列(需要重置密码).


Ric*_*iwi 5

注意:密码哈希不适用于双向加密(流氓dba可以解密它).它用于以允许验证的方式对其进行散列,而无需向任何人轻易显示密码.低水平甚至中等水平的冲突在某些方面是可取的,因此它允许密码通过(并且不幸的是其他变体)但是通过冲突你永远无法分辨出真正的密码究竟是什么.


一个简单的实现是通过密码运行HashBytes.您比较提供给存储的哈希的(哈希)密码.除非有人准备好彩虹表,否则他们将无法找到原始密码.

INSERT INTO <tbl> (..., passwd) values (...., HashBytes('SHA1', @password))
Run Code Online (Sandbox Code Playgroud)

验证密码时,您将获取密码的哈希值

SELECT HashBytes('SHA1', @password);
Run Code Online (Sandbox Code Playgroud)

并将其与输入进行比较.

  • 删除标记sql-server-2008后,可以使用SHA-2,但不能使用SHA-2.http://msdn.microsoft.com/en-us/library/ms174415%28v=sql.105%29.aspx (2认同)

JAi*_*iro -5

如果您的唯一任务是验证用户输入的密码是否正确,则不应加密密码。你应该对它们进行哈希处理。您可以使用任何算法对它们进行哈希处理,但我建议使用 MD5,因为它非常安全。1 :)

例如:

public string EncodePassword(string originalPassword)
{
//Declarations
Byte[] originalBytes;
Byte[] encodedBytes;
MD5 md5;

//Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash    (encoded password)
md5 = new MD5CryptoServiceProvider();
originalBytes = ASCIIEncoding.Default.GetBytes(originalPassword);
encodedBytes = md5.ComputeHash(originalBytes);

//Convert encoded bytes back to a 'readable' string
return BitConverter.ToString(encodedBytes);
}
Run Code Online (Sandbox Code Playgroud)

1编辑(非原始答案作者):密码的 MD5 被认为是不安全的,应使用更强大的算法。在阅读本文时,您应该研究当代算法。这篇文章可能是一个很好的起点。

  • 不要使用 md5,它不安全。可靠的碰撞创建已经工作了一段时间了。SHA1 也被破坏,但碰撞创建需要更长的时间。如果您需要安全的哈希算法,请使用 SHA2。它是可靠的,至少目前是这样。 (7认同)
  • MD5 并不是“非常安全”。如果您担心安全性,请使用 SHA-256 算法和盐。 (3认同)