在SQL Server 2008中存储用户密码的建议做法是什么?在SQL Server中存储密码
我正在存储内部网的用户详细信息,并希望获得有关存储用户详细信息(如名称,密码和用户访问权限等)的最佳方法的建议。我正在考虑创建一个nvarchar列,然后对其进行加密插入表格之前的文本。
在SQL Server 2008中存储用户密码的建议做法是什么?在SQL Server中存储密码
我正在存储内部网的用户详细信息,并希望获得有关存储用户详细信息(如名称,密码和用户访问权限等)的最佳方法的建议。我正在考虑创建一个nvarchar列,然后对其进行加密插入表格之前的文本。
通常是这样做的方式。
您的应用程序将处理加密(并可选地解密),数据库将只存储密码。
我建议使用的东西比过时事实上的强 - MD5
大多数.NET开发人员似乎喜欢使用TDES
我会同意你可以使用比MD5更强的东西 – 2009-05-18 05:26:40
MD5不是一种加密算法,它是一种哈希算法。 http://en.wikipedia.org/wiki/MD5 – 2009-05-18 05:27:55
同意。我想我没有明确,所以你得到了一个:) – 2009-05-18 05:36:59
T-SQL包括加密功能 - 4Guys有一个good article on it for SQL Server 2005 AA而回,但我认为这全部仍适用于2008年。
敏感数据的加密是好的。但是,使用密码时,您永远不需要知道原始值,因为任何已加密的内容都可以解密,所以您将该信息置于被发现的危险之中。
相反,你应该保持密码的散列。这个过程取得了这个值,并产生了相当复杂的校验和。鉴于这个数字,没有办法回到原来的密码,这增加了这些信息的安全性。当你想知道某个人是否给了你正确的密码时,你将他们给你的值散列并且比较散列值。
安全性是一个复杂的话题。即使使用哈希函数,您最终可能会遇到一个存在严重安全漏洞的系统。如果你的团队中没有人拥有这种知识,那么获得安全顾问的帮助并不是一个坏主意。
通常的存储密码的方法是在密码上使用散列函数,但是事先给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次,这会产生类似的效果)。
如果它是一个AD域,你不能让AD处理认证吗? – Rytmis 2009-05-18 06:01:47
谢谢大家的建议。 Richard – Richard 2009-05-19 00:19:03