当前位置:  开发笔记 > 编程语言 > 正文

在数据库中存储密码的首选方法

如何解决《在数据库中存储密码的首选方法》经验,为你挑选了5个好方法。

在数据库中存储密码的首选方法/数据类型是什么(最好是SQL Server 2005).我在几个应用程序中一直使用的方法是首先使用.NET加密库,然后将它们作为二进制文件存储在数据库中(16).这是首选方法还是我应该使用不同的数据类型或分配比16更多的空间?



1> Quintin Robi..:

我将密码的salted哈希等价物存储在数据库中,而不是密码本身,然后始终将哈希值与生成的用户传入的哈希值进行比较.

将文字密码数据存储在任何地方都太危险了.这使得恢复成为不可能,但是当有人忘记或丢失密码时,您可以执行一些检查并创建新密码.


我们也存储盐渍密码.在我们的例子中,我们将160位转换为base64,并将其存储在varchar中 - 它使事情变得更容易(字符串更容易读/写/看).除了全局盐之外,我们还使用用户的id(sid或guid)进行预先盐化,因此具有相同密码的两个用户不会提供相同的哈希值.这使得字典攻击更加困难(更多CPU成本),并且当每个人都选择相同的密码时,会阻止您同时发现多个密码.

2> Assaf Lavie..:

首选方法:永远不要在您的数据库中存储密码.只有哈希.加盐调味.


mod,必须这样做,只是为了盐笑话;)

3> Josh Stodola..:

我做了你所描述的同样的事情,除了它存储为一个字符串.I Base64编码加密的二进制值.分配的空间量取决于加密算法/密码强度.

我认为你做得对(假设你使用盐).


在这里解决真实问题的+1.

4> MiniQuark..:

    存储salted-password的哈希值,例如bcrypt(nounce + pwd).您可能更喜欢bcrypt而不是SHA1或MD5,因为它可以调整为CPU密集型,因此可以更长时间地进行暴力攻击.

    在几次登录错误后向登录表单添加验证码(以避免暴力攻击)

    如果您的应用程序有"忘记密码"链接,请确保它不通过电子邮件发送新密码,而是应该发送一个链接到(安全)页面,允许用户定义新密码(可能只有在确认后)一些个人信息,例如用户的出生日期.此外,如果您的应用程序允许用户定义新密码,请确保您要求用户确认当前密码.

    显然,保护登录表单(通常使用HTTPS)和服务器本身

通过这些措施,您的用户密码将得到相当好的保护:

    =>离线字典攻击

    =>实时字典攻击

    =>拒绝服务攻击

    =>各种各样的攻击!



5> erickson..:

由于散列函数的结果是0到255范围内的一系列字节(或-128到127,取决于您的8位数据类型的有符号关系),因此将其存储为原始二进制字段最有意义,因为它是最紧凑的表示,不需要额外的编码和解码步骤.

某些数据库或驱动程序对二进制数据类型没有很好的支持,或者有时开发人员对它们不熟悉并感觉不舒服.在这种情况下,使用像Base-64或Base-85这样的二进制到文本编码,并将结果文本存储在字符字段中是可以接受的.

必要字段的大小由您使用的哈希函数确定.MD5总是输出16个字节,SHA-1总是输出20个字节.一旦选择了哈希函数,您通常会坚持使用它,因为更改需要重置所有现有密码.因此,使用可变大小的字段并不能为您带来任何好处.


关于执行散列的"最佳"方法,我试图提供关于该主题的其他SO问题的许多答案:

加密密码

加密密码

在.NET中加密密码

盐:秘密还是公众?

哈希迭代

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有