在数据库中存储密码的首选方法/数据类型是什么(最好是SQL Server 2005).我在几个应用程序中一直使用的方法是首先使用.NET加密库,然后将它们作为二进制文件存储在数据库中(16).这是首选方法还是我应该使用不同的数据类型或分配比16更多的空间?
我将密码的salted哈希等价物存储在数据库中,而不是密码本身,然后始终将哈希值与生成的用户传入的哈希值进行比较.
将文字密码数据存储在任何地方都太危险了.这使得恢复成为不可能,但是当有人忘记或丢失密码时,您可以执行一些检查并创建新密码.
首选方法:永远不要在您的数据库中存储密码.只有哈希.加盐调味.
我做了你所描述的同样的事情,除了它存储为一个字符串.I Base64编码加密的二进制值.分配的空间量取决于加密算法/密码强度.
我认为你做得对(假设你使用盐).
存储salted-password的哈希值,例如bcrypt(nounce + pwd).您可能更喜欢bcrypt而不是SHA1或MD5,因为它可以调整为CPU密集型,因此可以更长时间地进行暴力攻击.
在几次登录错误后向登录表单添加验证码(以避免暴力攻击)
如果您的应用程序有"忘记密码"链接,请确保它不通过电子邮件发送新密码,而是应该发送一个链接到(安全)页面,允许用户定义新密码(可能只有在确认后)一些个人信息,例如用户的出生日期.此外,如果您的应用程序允许用户定义新密码,请确保您要求用户确认当前密码.
显然,保护登录表单(通常使用HTTPS)和服务器本身
通过这些措施,您的用户密码将得到相当好的保护:
=>离线字典攻击
=>实时字典攻击
=>拒绝服务攻击
=>各种各样的攻击!
由于散列函数的结果是0到255范围内的一系列字节(或-128到127,取决于您的8位数据类型的有符号关系),因此将其存储为原始二进制字段最有意义,因为它是最紧凑的表示,不需要额外的编码和解码步骤.
某些数据库或驱动程序对二进制数据类型没有很好的支持,或者有时开发人员对它们不熟悉并感觉不舒服.在这种情况下,使用像Base-64或Base-85这样的二进制到文本编码,并将结果文本存储在字符字段中是可以接受的.
必要字段的大小由您使用的哈希函数确定.MD5总是输出16个字节,SHA-1总是输出20个字节.一旦选择了哈希函数,您通常会坚持使用它,因为更改需要重置所有现有密码.因此,使用可变大小的字段并不能为您带来任何好处.
关于执行散列的"最佳"方法,我试图提供关于该主题的其他SO问题的许多答案:
加密密码
加密密码
在.NET中加密密码
盐
盐:秘密还是公众?
哈希迭代