【发布时间】:2014-09-09 01:09:22
【问题描述】:
简短的问题:我不想使用 bcrypt 随机生成的盐。假设我正在散列的密码是“abcd1234”。在过去的好日子里,salt 是“ab”或“abcd”或“abcd12”,换句话说,salt 将是密码的前 N 个字符,其中 N 是密码所需的最小长度。那么如何从密码本身生成有效的 bcrypt 盐呢?
长问题:我正在使用消息传递系统,换句话说,将在内部发送一条消息以进行身份验证,并且由于显而易见的原因,我无法在此消息中包含纯文本密码。所以流程应该是这样的:
- 机器 A 获取明文密码
- 机器 A 使用 bcrypt 对密码进行哈希处理
- 散列(即安全)密码在我的内部消息中发送
- 机器 B 是具有哈希密码数据库的身份验证机器,它获取消息,现在它必须将收到的哈希密码与数据库中的哈希密码进行比较以进行身份验证。
但是,如果 BCrypt 不允许我使用从我的纯文本密码派生的盐,我该怎么做?机器 A 对任何盐一无所知。它对数据库没有任何访问权限。机器 B 会知道这一点。所以必须有一种方法可以从“abcd1234”中导出我的 bcrypt 盐,或者 bcrypt 应该有一个方法:
check(String hashedPasswordWithSaltA, String hashedPasswordWithSaltB);
简单地说:机器 A 获取密码,机器 B 是拥有身份验证数据库的机器。我不想以明文形式将密码从 A 传递到 B,但看起来 bcrypt 迫使我这样做。 :(
【问题讨论】:
-
这首先破坏了使用盐的目的:两个相同的密码具有相同的盐,因此具有相同的哈希值。此外,由于您必须以纯文本形式存储盐,因此您实际上是在泄露大量用户密码。
-
@Quirliom 我不确定你说的是否有道理。你能澄清一下吗?我的观点是机器 A 获得密码,而机器 B 是拥有数据库的机器。我不想以明文形式将密码从机器 A 传递给机器 B,但看起来 bcrypt 会强迫我这样做。 :(
-
添加了一个答案来尝试解释。
标签: java encryption hash bcrypt