在SQL Server中存储密码

在SQL Server 2008中存储用户密码的build议做法是什么?

我正在存储用户的内部网的详细信息,并希望得到最好的方式来存储用户的详细信息,如姓名,密码和用户访问privillages等build议。我正在考虑创build一个nvarchar列,然后encryption这个文本,然后再插入桌子。

通常的存储密码的方法是在密码上使用散列函数,但是要事先用盐密码。 “密码”是重要的,为了防止彩虹表攻击。

所以你的桌子应该是这样的

._______._________________.______________. |user_id|hash |salt | |-------|-----------------|--------------| |12 |adsgasdg@g4wea...|13%!#tQ!#3t...| | |... |... | 

在检查给定的密码是否与用户匹配时,应该将salt连接到给定的密码,并计算结果string的散列函数。 如果哈希函数输出与hash列匹配 – 那是正确的密码。

然而,了解salt-hash思路有一个特定的原因是很重要的 – 防止任何访问数据库的人知道任何密码(这被认为是难以颠倒散列函数输出的问题)。 因此,例如,银行的DBA将无法login到您的银行帐户,即使他有权访问所有列。

如果您认为您的用户将使用敏感的密码(例如他们的Gmail帐户的密码)作为您的网站的密码,您还应该考虑使用它。

恕我直言,它并不总是一个安全function,这是必要的。 所以你应该考虑是否你想要它。

请参阅这篇文章 ,了解这个机制的一个好的总结。

更新:值得一提的是,为了抵御针对个人密码哈希的目标攻击的额外安全性,您应该使用bcrypt ,它可以任意难以计算。 (但是除非你真的害怕神秘的黑人瞄准你的特定数据库,否则我认为sha1足够好了,我不会为这个额外的安全性引入另一个依赖项目,也就是说,没有理由不使用sha1 100次,这会产生类似的效果)。

敏感数据的encryption是好的。 但是,对于密码,你永远不需要知道原始值,因为任何被encryption的东西都可以被解密,所以你把这些信息置于被发现的危险之中。

相反,你应该保持密码的散列。 这个过程取值并产生一个非常复杂的校验和。 鉴于这个数字,没有办法回到原来的密码,这增加了这些信息的安全性。 当你想知道某个人是否给了你正确的密码时,你把他们给你的价值进行哈希,然后比较哈希值。

安全是一个复杂的话题。 即使使用哈希值,您也可能拥有一个具有严重安全漏洞的系统。 如果你的团队中没有人拥有这样的知识,那么获得安全顾问的帮助并不是一个坏主意。

通常是这样做的方式。

您的应用程序将处理encryption(和可选的解密),数据库将只存储密码。

我build议使用比过时的更实用的东西 – MD5

大多数.net开发者似乎喜欢使用TDES

T-SQL包括encryptionfunction – 4Guys在SQL Server 2005 aa 上有一篇很好的文章,但是我认为这一切仍然适用于2008年。