我需要存储bcrypt的盐值吗?

207

bCrypt的javadoc中给出了如何加密密码的代码:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

要检查明文密码是否与先前哈希过的密码匹配,请使用checkpw方法:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

这些代码片段让我觉得随机生成的 salt 被丢弃了。这是真的吗,还是这只是一个误导性的代码片段?

1个回答

235

盐被加入到哈希中(以类似base64的格式编码)。

例如,在传统的Unix密码中,盐被存储为密码的前两个字符。其余字符代表哈希值。校验函数知道这一点,并将哈希分解以取回盐。


64
盐值已经被包含在密码中,因此您不需要保存盐值。 - Swapnonil Mukherjee
2
谢谢你。我希望他们在Javadoc中说过这些 :) (我已经查看了源代码并确认 - 但之前我不知道自己在寻找什么) - RodeoClown
1
谢谢 - 我也在试图弄清楚这个问题!现在我在想这是否是一个好主意。将盐保留在哈希中与将其分开存储相比,有什么优缺点吗? - Adam
8
由于盐值是随机生成的,这意味着您不需要在数据库中建立关联这两个事物的方法。 - RodeoClown
我查看了源代码并发现,尽管salt参数的JavaDoc是“可能使用BCrypt.gensalt生成”,但我发现你必须使用genSalt()方法,否则会出现异常 =/ - the_new_mr
或者让盐以非常特定的格式出现。他们可能会将盐排除作为方法的参数,只需在内部调用它。使用自己的盐测试代码证实了这一点(对不起我评论发重了)。这让我想知道这段代码到底有多安全(也许很好...我只是想知道)。 - the_new_mr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接