Blowfish密码验证

时间:2014-11-12 19:56:25

标签: java spring-security blowfish

我在这个问题中使用Spring安全性,但可能不需要它的知识来回答这个问题。

我试图了解Spring security的blowfish加密类(BCrypt)如何验证给定的密码。我试着:

  1. 使用BCrypt.gensalt(10);
  2. 生成Salt
  3. 使用此BCrypt.hashpw(clearText, salt)
  4. 对此密码进行编码

    它工作得很好。然后,我想将用过的salt存储在数据库中,以便在用户输入密码时能够重用它。

    我意识到BCryptPasswordEncoder在检查密码时不使用salt。相反,它使用哈希密码将密码密码为salt:

    public boolean matches(CharSequence rawPassword, String encodedPassword) {
      [...]
      return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
    }
    

    所以我尝试了这段代码:

    public static void main(String[] args) {
        String salt = BCrypt.gensalt(12);
        String clearText="test";
        String hashed = BCrypt.hashpw(clearText, salt);
        String reHashed = BCrypt.hashpw(clearText, hashed);
    
        System.out.println("salt : " + salt);
        System.out.println(hashed);
        System.out.println(reHashed);
    }
    

    输出

    salt : $2a$12$gzUymsNBoW.f1OfkLpb2se
    $2a$12$gzUymsNBoW.f1OfkLpb2seFZrniorawujSOp6Qe.PWDIHJvmYSP6y
    $2a$12$gzUymsNBoW.f1OfkLpb2seFZrniorawujSOp6Qe.PWDIHJvmYSP6y
    

    这似乎证实了:

    good password => hashed = hash(clearPassword, hashed)
    

    我理解错了吗?这是否意味着盐对密码检查毫无用处?因此,这是否意味着我不需要将盐存储在数据库中?

1 个答案:

答案 0 :(得分:3)

BCrypt将盐存储为" hash"它返回的字符串 这由Bcrypt.*函数处理,因此您无需执行任何操作。