假设您可以自由决定如何将散列密码存储在 DBMS 中。像这样的计划有明显的弱点吗?
要创建存储在 DBMS 中的哈希值,请使用:
- 作为 salt 的一部分对 DBMS 服务器实例唯一的值,
- 而用户名作为盐的第二部分,
- 并使用实际密码创建盐的串联,
- 并使用 SHA-256 算法对整个字符串进行哈希处理,
- 并将结果存储在 DBMS 中。
这意味着任何想要提出冲突的人都必须分别为每个用户名和每个 DBMS 服务器实例单独完成工作。我计划让实际的散列机制保持一定的灵活性,以允许使用仍在研究中的新NIST标准散列算法 ( SHA-3 )。
“DBMS 服务器实例独有的值”不必保密——尽管它不会随便泄露。目的是确保如果有人在不同的 DBMS 服务器实例中使用相同的密码,则记录的哈希值会有所不同。同样,用户名也不会是秘密的——只有正确的密码。
首先是密码,然后是用户名和“唯一值”,或者三个数据源的任何其他排列,会有什么好处吗?或者如何交错字符串?
我是否需要添加(并记录)随机盐值(每个密码)以及上述信息?(优点:用户可以重复使用密码,并且可能仍然会在数据库中记录不同的哈希值。缺点:必须记录盐。我怀疑优点远大于缺点。)
有很多相关的 SO 问题 - 这个列表不太可能是全面的:
我认为这些问题的答案支持我的算法(尽管如果您只是使用随机盐,那么“每个服务器的唯一值”和用户名组件就不那么重要了)。