gpt4 book ai didi

java - Spring MVC-带或不带盐的身份验证

转载 作者:行者123 更新时间:2023-12-01 21:09:21 25 4
gpt4 key购买 nike

我当前注册和验证用户的方法如下:

class User{

private String username;
private String password;
private String salt;
}

注册:

addUser(String username, String password){

user.setUsername(username);

user.setSalt(BCrypt.gensalt());

user.setPassword(BCrypt.hashpw(password, user.getSalt()));
}

身份验证:

authenticate(User user){

User userDB = getUserFromDB(user.getUsername());

userDB.getPassword().equals(BCrypt.hashpw(user.getPassword(), userDB.getSalt()))

}

但是,我正在研究 Spring Boot 身份验证系统,我看到人们推荐使用 BCryptPasswordEncoder ,它仅使用密码而不使用盐。

我需要知道我现有的方法是否比推荐的方法更好或更差。

最佳答案

BCryptPasswordEncoder 使用盐。来自 documentation :

public String encode(CharSequence rawPassword)

Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or greater hash combined with an 8-byte or greater randomly generated salt.

来自source :

public String encode(CharSequence rawPassword) {
String salt;
if (strength > 0) {
if (random != null) {
salt = BCrypt.gensalt(strength, random);
}
else {
salt = BCrypt.gensalt(strength);
}
}
else {
salt = BCrypt.gensalt();
}
return BCrypt.hashpw(rawPassword.toString(), salt);
}

BCryptPasswordEncoder 在编码时生成自己的盐。这就是可选的 SecureRandom 构造函数参数的用途。 BCrypt 的输出包含盐,这是验证原始密码的方式。这就是为什么 matches 方法需要已经编码的密码。

bcrypt“example”的示例输出:

$2y$10$Tqq.bRDh6N3JDNzn0oBd7OCFjsHyiuf39VMmZnrw9MWi.xtTiWtni

bcrypt 的输出包括:

  • 2y 表示 Blowfish 密码
  • 10 轮(实际上是 2^10 轮)
  • 第三个 $ 之后的前 22 个字符是盐,其余的是哈希

PHP documentation描述 bcrypt 输出:

Blowfish hashing with a salt as follows: "$2a$", "$2x$" or "$2y$", a two digit cost parameter, "$", and 22 characters from the alphabet "./0-9A-Za-z".

<小时/>

你的方法做了同样的事情,但是你自己显式地存储盐。您可以简单地使用存储在 bcrypt 输出中的盐,而不是单独存储盐,如方法 public static boolean checkpw(String plaintext, String hashed) 中所述。

关于java - Spring MVC-带或不带盐的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com