客户端拥有庞大的用户群,我需要以安全的方式加密/散列密码。问题是我不能要求每个用户更改他们的密码,并且密码已经使用md5()而没有盐进行哈希处理。这样做的一种方法是使用salt加密当前密码,当用户更改或重置密码时,我只需用盐加密它。
这样做是否有任何陷阱或更多或更少的明显危险[我的意思是sha1(含盐的md5(密码)]]?
感谢您的时间
答案 0 :(得分:3)
在用户表中添加一个新字段,用于存储新的安全哈希密码 - 为此,请执行一些安全的操作,包括每用户盐和多轮。检查其他人正在做什么(例如,bcrypt)而不是自己动手。
在进行密码检查时,如果newPass字段为空,请使用旧密码查找,但敦促用户在进行身份验证后重置密码。
修改当前(旧)密码方案为hash(perUserSalt + existingPassWordHash)应该可以正常工作。
答案 1 :(得分:2)
如果您打算使用sha1(md5(password).$salt)
,那就没事了
您可以进一步使用此系统。用户更改密码时无需采取任何特殊操作。只需以相同的方式对其进行加密:sha1(md5(new password).$salt)
答案 2 :(得分:1)
这取决于你试图防御的攻击。如果攻击是查看数据库的人,那么您可以使用对称加密方法(如AES)和在数据库外部定义的密钥。使用此方法需要验证过程知道加密密钥,并通过使用加密密钥加密散列密码来更新数据库中的所有行。
如果以上不是选项,则表示您遇到问题。 ;)
问题是,现在您不知道用户的密码究竟是什么。你所拥有的只是哈希版本。验证登录的例程是获取用户提供的输入,对其进行哈希处理,并将计算出的哈希值与存储的哈希值进行比较。
您的选择是存储旧哈希并创建一个新字段来存储新算法。然后,当人们登录系统时,执行升级的salted-hash并删除旧哈希。这将按预期工作,但如果一个人从未重新登录(或更改其密码),他们将永远不会升级到哈希的盐渍版本。
我个人的意见是使用AES加密选项,因为这样可以防止随意查看散列密码,并且它涵盖了所有数据库中的密码。