2009-05-18 81 views
39

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

我正在存储内部网的用户详细信息,并希望获得有关存储用户详细信息(如名称,密码和用户访问权限等)的最佳方法的建议。我正在考虑创建一个nvarchar列,然后对其进行加密插入表格之前的文本。

+2

如果它是一个AD域,你不能让AD处理认证吗? – Rytmis 2009-05-18 06:01:47

+0

谢谢大家的建议。 Richard – Richard 2009-05-19 00:19:03

回答

2

通常是这样做的方式。

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

我建议使用的东西比过时事实上的强 - MD5

大多数.NET开发人员似乎喜欢使用TDES

+0

我会同意你可以使用比MD5更强的东西 – 2009-05-18 05:26:40

+3

MD5不是一种加密算法,它是一种哈希算法。 http://en.wikipedia.org/wiki/MD5 – 2009-05-18 05:27:55

+0

同意。我想我没有明确,所以你得到了一个:) – 2009-05-18 05:36:59

7

敏感数据的加密是好的。但是,使用密码时,您永远不需要知道原始值,因为任何已加密的内容都可以解密,所以您将该信息置于被发现的危险之中。

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

安全性是一个复杂的话题。即使使用哈希函数,您最终可能会遇到一个存在严重安全漏洞的系统。如果你的团队中没有人拥有这种知识,那么获得安全顾问的帮助并不是一个坏主意。

53

通常的存储密码的方法是在密码上使用散列函数,但是事先给salt。 “密码”是非常重要的,以防御自己对抗rainbow table攻击。

所以,你的表应该是这个样子的是

._______._________________.______________. 
|user_id|hash    |salt   | 
|-------|-----------------|--------------| 
|12  |[email protected]|13%!#tQ!#3t...| 
|  |...    |...   | 

检查时,如果给定的密码的用户相匹配,你应该串联的盐,以给定的密码,并计算出结果字符串的哈希函数。如果散列函数输出匹配hash列 - 它是正确的密码。

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

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

恕我直言,它并不总是需要的安全功能。所以你应该考虑你是否想要它。

请参阅this article以便对此机制进行很好的总结。

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