我已经阅读了许多关于这个主题的 SO 问题,但是我无法理解存储密码的加盐哈希的应用实践。
让我们从一些基本规则开始:
- 密码“foobar12”(我们不讨论密码的强度)。
- 一种语言,用于本次讨论的 Java 1.6
- 数据库、postgreSQL、MySQL、SQL Server、Oracle
有几个选项可用于存储密码,但我想考虑一 (1) 个:
将使用随机盐散列的密码存储在数据库中,一列
明文存储自动失效问题暂不讨论。:) 在 SO 和其他地方发现的是具有 MD5/SHA1 和使用双列的解决方案,各有利弊。
MD5/SHA1 很简单。Java 中的 MessageDigest 提供 MD5、SHA1(通过现代实现中的 SHA512,当然是 1.6)。此外,列出的大多数 RDBMS 都提供了插入、更新等 MD5 加密功能的方法。一旦了解“彩虹表”和 MD5 冲突(我已经了解了这些概念),问题就会变得明显。
双列解决方案基于salt
不需要保密的想法(理解它)。但是,如果您的旧系统具有一 (1) 列用于密码并且更新表和代码的成本可能太高,那么第二列引入的复杂性可能不是一种奢侈。
但它将密码用随机盐散列在单个数据库列中,我需要更好地理解,并具有实际应用。
我喜欢这个解决方案有几个原因:期望使用盐并考虑遗留边界。这就是我迷路的地方:如果盐是随机的,并且密码加盐被散列以产生单向值用于存储,那么系统如何匹配明文密码和新的随机盐?
我对此有理论,当我输入时,我可能会理解这个概念:给定一个 128 字节的随机盐和一个 8 字节的密码('foobar12'),它可以通过编程方式删除散列的一部分盐,通过散列一个随机的 128 字节盐并获取原始散列的子字符串,即散列密码。然后使用散列算法重新散列以匹配......?
所以......任何接受帮助的人。:) 我很亲密吗?