我担心使用 bcrypt 生成客户端密码。我正在开发一个在客户端使用的密码生成功能,类似于 PwdHash 和 PasswordMaker。
关于使用 bcrypt 相对于更快的哈希函数的优势已经说了很多,因为它可以减慢蛮力攻击。我知道 bcrypt 在内部使用 Blowfish,这是一种对称加密算法,而不是哈希算法。所以在某处必须有一个硬编码的密钥才能使用 bcrypt,而且由于使用的是 Blowfish,所以按道理如果发现了密钥,则可以反转密码推导并发现原始密码。
由于客户端代码可以反编译,密钥很容易被发现,使得 bcrypt 在客户端使用不安全。我的推理是正确的还是我错过了什么?
此外,在一个相关问题中,同样的论点在服务器端也不是有效的。散列函数不能反转,但如果密钥已知,加密函数可以反转。使用真正的哈希服务器端不是更安全吗,即使它更快,因此更容易受到暴力攻击,而不是使用可逆的 bcrypt?
编辑:user10008 下面的注释(帖子已被删除)只有部分 Blowfish 用于 bcrypt 并给了我一个链接。当我点击一个链接时,我发现了一个函数原型,其中包含 key 作为最后一个参数。所以我仍然看到用于启动 bcrypt 算法的密钥。如果需要密钥,并且 bcrypt 使用对称加密而不是散列,那么操作不是可逆的吗?
编辑:来自 martinstoeckli 和 user10008 的好答案。由于响应中的最后一句话,我给了marginstoeckli的答案:
BCrypt可以被视为通过丢弃密钥进行加密。
这真的为我清除了它。基本上,我们经历了两个阶段
P -> K ;P,K -> C
然后丢弃密钥 K,留下密文 C。因为我们丢弃了密钥 K,我们无法解密回明文 P。丢弃 K 有效地使 bcrypt 成为单向函数。
编辑:从 user10008 开始,我上面给出的步骤更复杂,但本质是密钥 K 在最后阶段使用并被丢弃。感谢用户 10008。