Spring Security使用argon2加密

Spring Security默认使用bCryptPasswordEncoder进行加密,因项目需要

,使用内置的argon2PasswordEncoder进行加密,经测试比bcrypt算法要慢。

需要引入Bouncy Castle Provider依赖,否则会找不到

org.bouncycastle.crypto

这个包;

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>
//加密  
  Argon2PasswordEncoder argon2PasswordEncoder = new Argon2PasswordEncoder();
  String pw = argon2PasswordEncoder.encode("123456");
 
//校验
  boolean b = argon2PasswordEncoder.matches("123456","$argon2id$v=19$m=4096,t=3,p=1$jUuSVpSYTWWVg3gaqdmZIw$dj5+Xh24Ifc2uUI2AVtGvLnQhMRW60DCQ4Dk8mdUaBY");
### Spring Security 认证、授权和加密的实现机制 #### 一、认证(Authentication) Spring Security 的认证过程主要围绕 `UsernamePasswordAuthenticationToken` 和一系列过滤器展开。核心逻辑通常发生在默认的安全过滤器链中,特别是 `DefaultSecurityFilterChain` 中的关键组件如 `UsernamePasswordAuthenticationFilter` 负责处理表单登录请求[^3]。 以下是认证的主要流程: 1. 用户提交用户名和密码至 `/login` 端点。 2. 请求被拦截并传递给 `UsernamePasswordAuthenticationFilter` 进行初步验证。 3. 如果验证成功,则创建一个已认证的身份令牌 (`Authentication`) 并存储在安全上下文中。 4. 验证失败则返回错误响应。 ```java @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login") // 自定义登录页面 .permitAll(); // 登录页面无需身份验证即可访问 } ``` 上述代码片段展示了如何自定义登录页以及允许未认证用户访问登录界面[^4]。 --- #### 二、授权(Authorization) Spring Security 提供了多层次的授权支持,涵盖了 URL 基础权限管理到方法级别的细粒度控制[^2]。其核心概念如下: - **基于角色的访问控制 (RBAC)** 使用 `@PreAuthorize`, `@PostAuthorize` 注解或者 XML/Java Config 定义特定路径只允许某些角色访问。 ```java @RestController public class SecureController { @PreAuthorize("hasRole('ADMIN')") public String adminEndpoint() { return "Admin Content"; } } ``` 此示例说明了一个仅限管理员角色调用的方法。 - **表达式驱动的安全性** 支持复杂的 SpEL 表达式来决定谁有资格执行某项操作。 --- #### 三、加密(Encryption and Encoding) 为了保护数据传输中的隐私性和完整性,Spring Security 利用了多种编码技术,比如 BCrypt 或者 Argon2 来散列用户的密码[^1]。 下面是一个典型的密码编码配置实例: ```java @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } // 在服务层保存新用户时应用编码 @Service public class UserServiceImpl implements UserDetailsService { private final UserRepository userRepository; private final PasswordEncoder encoder; public UserServiceImpl(UserRepository userRepository, PasswordEncoder encoder) { this.userRepository = userRepository; this.encoder = encoder; } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { var user = userRepository.findByUsername(username); if(user == null){ throw new UsernameNotFoundException("User not found"); } return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), true, true, true, true, AuthorityUtils.createAuthorityList("USER")); } public void saveNewUser(User newUser) { String hashedPassword = encoder.encode(newUser.getPassword()); newUser.setPassword(hashedPassword); // 存储前先哈希化原始密码 userRepository.save(newUser); } } ``` 这里演示了如何利用 `BCryptPasswordEncoder` 对明文密码进行不可逆转换后再存入数据库。 --- #### 四、最佳实践总结 1. 尽量采用 HTTPS 协议保障通信层面的数据安全性; 2. 不要硬编码任何敏感信息于源码之中; 3. 定期更新所使用的算法版本以抵御新型攻击手段; 4. 测试阶段务必启用完整的日志记录以便排查潜在漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_xlinx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值