来自维基百科Salt (cryptography):
为每个密码随机生成一个新的salt。在典型设置中,salt和密码被连接并使用加密哈希函数进行处理,结果输出(但不是原始密码)与salt一起存储在数据库中。
但是如果我没有离散数据库怎么办?是否可以使用密码的固有属性进行加盐,例如反向?或者甚至(更好?)用密码的哈希来腌制密码?例如:
md5(md5("password") + "password")
当然会有性能影响,但如果我正在使用低访问系统,这种salting会显示任何漏洞吗?
同样,我这样做的主要原因是为了省去储存盐的麻烦。
答案 0 :(得分:2)
因为你必须存储密码的哈希加上任何盐的某个地方(否则,你需要比较什么时候进行身份验证),为什么不将它们存储在一起呢?
将密码和salt的salt和哈希结果存储在单个字段中并不罕见。如果需要,可以使用恒定长度的盐,或者使用不属于盐中使用的字符集的分隔符来分隔它们。
答案 1 :(得分:1)
这种腌制会显示任何漏洞吗?
是。唯一盐的一个关键目的是确保选择相同密码的用户具有不同的密码哈希值。如果根据密码计算盐,则共享相同密码的用户也将共享相同的密码哈希值。
使用哈希数据库,攻击者可以简单地找到多次出现的哈希值。这种密码很可能是弱势攻击的目标。
如果您必须存储密码且无法存储专用盐,则更好的方法是使用与帐户关联的不变字段(例如,用户名或帐户标识符)作为盐。这种方法可以防止数据库中出现重复的密码哈希值。