我需要用bcrypt存储盐吗?


189

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");

这些代码段向我暗示,随机生成的盐将被丢弃。是这种情况,还是只是误导性的代码片段?

Answers:


214

盐被合并到哈希中(以base64样式格式编码)。

例如,在传统的Unix密码中,盐被存储为密码的前两个字符。其余字符表示哈希值。Checker函数知道这一点,然后将散列拉开以将盐取回。


59
盐是包含在密码中的。因此,您不必节省盐分。
Swapnonil Mukherjee

2
感谢那。我希望他们在javadoc中这样说:)(我已经看过源代码并确认了-但是我之前不知道自己在找什么)
RodeoClown

1
谢谢-我也想解决这个问题!现在我想知道这是否是个好主意。与单独存储盐相比,将盐保留在哈希中是否有优点/缺点?
亚当

8
@Adam-由于盐是随机生成的,这意味着您不需要将数据库中的两件事关联的方法。
RodeoClown 2011年

我看了一下源代码,发现尽管salt参数的JavaDoc是“也许是使用BCrypt.gensalt生成的”,但我发现您必须使用genSalt()方法,否则将获得异常= /
the_new_mr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.