java 登陆验证的盐_使用Spring安全性的自定义密码盐

我想用bcrypt和Spring安全性哈希和盐用户密码 .

这是我的用户模型(我删除了无用的代码):

public class User {

private Integer id;

private String email;

private String hashedPassword;

private String salt; //I want to use this salt.

private Boolean enabled;

//Getters & Setters

}

以下是我使用自己的salt创建新用户的方法:

@Transactional

public User create(String email, String password) {

User user = new User();

user.setSalt(BCrypt.gensalt(12)); //Generate salt

user.setEnabled(true);

user.setEmail(email);

user.setHashedPassword(BCrypt.hashpw(password, user.getSalt()));

return dao.persist(user);

}

这是 spring 配置:

在此配置中,我指示 PasswordEncoder 必须使用 User.getSalt() ;

Problem :我得到以下 Error 500 :

与crypto模块PasswordEncoder一起使用时,salt值必须为null .

在查看stackoverflow之后,似乎salt必须为null,因为BCryptPasswordEncoder使用自己的SaltSource .

有没有办法使用我的 SaltSource ?要么

哪个可靠的算法会允许我 SaltSource ?

谢谢 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 中使用密码是一种常见的安全策略,可以增加密码的强度,防止彩虹表攻击。下面是一个简单的示例代码,演示了如何使用密码: 首先,确保你已经添加了 Spring Security 的依赖包。 在你的用户实体类中,一般是实现了 UserDetails 接口的自定义 User 类,可以添加一个额外的字段用于保存密码值。例如: ```java @Entity @Table(name = "users") public class User implements UserDetails { // 其他属性... @Column(name = "salt") private String salt; // getter 和 setter 方法... } ``` 接下来,在用户注册或者密码更新时,需要生成一个随机的值,并将值与密码进行混合计算并保存。可以使用 Spring Security 提供的 PasswordEncoder 接口来完成。例如: ```java @Autowired private PasswordEncoder passwordEncoder; public void registerUser(User user, String rawPassword) { // 生成随机值 SecureRandom random = new SecureRandom(); byte[] saltBytes = new byte[16]; random.nextBytes(saltBytes); String salt = Base64.getEncoder().encodeToString(saltBytes); // 将值保存到用户实体类中 user.setSalt(salt); // 对密码进行加加密 String encodedPassword = passwordEncoder.encode(rawPassword + salt); user.setPassword(encodedPassword); // 保存用户信息 userRepository.save(user); } ``` 这样,密码就被加后保存在数据库中。在用户登录时,可以使用相同的密码方式进行验证。例如: ```java @Autowired private PasswordEncoder passwordEncoder; public boolean authenticate(String username, String rawPassword) { User user = userRepository.findByUsername(username); if (user != null) { // 获取用户保存的值 String salt = user.getSalt(); // 对用户输入的密码进行加加密 String encodedPassword = passwordEncoder.encode(rawPassword + salt); // 比较加密后的密码是否与数据库中保存的密码相同 return encodedPassword.equals(user.getPassword()); } return false; } ``` 这样,就可以使用密码来增加密码安全性了。希望对你有所帮助!如果你有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值