安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证

简介: 【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。


在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。

一、什么是 TOTP?

TOTP(Time-based One-Time Password)是一种基于时间的动态密码生成算法,通常与手机应用程序(如 Google Authenticator)结合使用。每个密码只在很短的时间内有效(一般为30秒),这大大提高了系统的安全性。

二、准备工作

  1. Spring Boot 3.3:确保你使用的 Spring Boot 版本是3.3或更高,因为一些依赖和功能可能会随着版本更新而发生变化。
  2. 依赖项:添加必要的依赖项,如 spring-boot-starter-webspring-boot-starter-data-jpa 以及 spring-boot-starter-security。此外,我们还需要 javax.validationqrcode-generator 等库来生成二维码。
  3. 数据库:需要一个数据库来存储用户的TOTP密钥和相关信息。

三、实现步骤

  1. 用户实体类
    创建一个用户实体类,包含用户名、密码、TOTP密钥等字段。
java复制代码
@Entity
public class User {  
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;  
private String username;  
private String password;  
private String secretKey; // TOTP密钥  
// getters and setters  
}
  1. TOTP服务类
    使用 Google 的 google-auth-library-java 来生成和验证TOTP。
java复制代码
@Service
public class TotpService {  
private static final int TIME_STEP_SIZE_IN_MILLIS = 30; // 30秒  
public String generateTotp(String secretKey) {  
Key key = new SecretKeySpec(Base32.decode(secretKey), "HMACSHA1");  
TotpGenerator totpGenerator = new TotpGenerator(TimeSource.SYSTEM, key, TIME_STEP_SIZE_IN_MILLIS);  
return totpGenerator.now().toString();  
    }  
public boolean verifyTotp(String secretKey, String totp) {  
Key key = new SecretKeySpec(Base32.decode(secretKey), "HMACSHA1");  
TotpGenerator totpGenerator = new TotpGenerator(TimeSource.SYSTEM, key, TIME_STEP_SIZE_IN_MILLIS);  
return totpGenerator.verify(totp);  
    }  
}
  1. 控制器
    创建控制器来处理TOTP相关的请求,如绑定、验证等。
java复制代码
@RestController
@RequestMapping("/auth/totp")
public class TotpController {  
@Autowired
private TotpService totpService;  
@Autowired
private UserRepository userRepository;  
@PostMapping("/bind")
public ResponseEntity<?> bindTotp(@RequestParam String username) {  
User user = userRepository.findByUsername(username);  
if (user == null) {  
return ResponseEntity.notFound().build();  
        }  
String secretKey = Base32.encodeAsString(new SecretKeySpec(SecureRandom.getInstanceStrong().generateSeed(20), "HMACSHA1").getEncoded());  
        user.setSecretKey(secretKey);  
        userRepository.save(user);  
// 生成二维码供用户扫描  
String qrCodeUrl = "otpauth://totp/YourAppName:" + user.getUsername() + "?secret=" + secretKey + "&issuer=YourAppName";  
// 返回二维码URL或其他响应  
return ResponseEntity.ok(qrCodeUrl);  
    }  
@PostMapping("/verify")
public ResponseEntity<?> verifyTotp(@RequestParam String username, @RequestParam String totp) {  
User user = userRepository.findByUsername(username);  
if (user == null || !totpService.verifyTotp(user.getSecretKey(), totp)) {  
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();  
        }  
return ResponseEntity.ok().build();  
    }  
}

四、总结

通过以上步骤,我们在 Spring Boot 3.3 中成功实现了基于 TOTP 的双因素认证。这种方法不仅提高了应用的安全性,而且易于实现和集成。你可以根据实际需求进行扩展和优化,比如增加失败次数限制、记录日志等。

在实际项目中,安全性是一个复杂而重要的课题。通过双因素认证,我们可以为用户提供更可靠的安全保障。希望本文对你有所帮助,让你在开发过程中更加轻松实现安全无忧的应用。

目录
相关文章
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
273 0
|
14天前
|
安全 Java 数据安全/隐私保护
基于内存认证的 Spring Security
通过本文的介绍,希望您能够深入理解基于内存认证的Spring Security配置与使用方法,并能够在实际开发中灵活应用这一技术,提升应用的安全性和用户体验。
44 9
|
4月前
|
安全 Java 数据安全/隐私保护
密钥在手,安全无忧:探索Spring Boot中SecretKeySpec与Cipher的神秘力量
【8月更文挑战第29天】在现代软件开发中,数据安全至关重要。本文作为教程,介绍如何在Spring Boot应用中利用`SecretKeySpec`和`Cipher`实现基本的加密和解密功能。首先,需添加相关依赖,然后创建工具类封装加密与解密方法。通过示例演示了如何生成密钥、加密及解密数据。正确实现加密能有效保护敏感信息,增强应用安全性。开发者应根据需求选择合适算法和密钥长度,确保数据安全。
152 0
|
29天前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
66 8
|
2月前
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
199 3
springboot整合springsecurity,从数据库中认证
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
41 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
4月前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
4月前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
189 4
|
4月前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
58 0
|
6月前
|
存储 安全 Java
Spring Boot中的OAuth2认证与授权
Spring Boot中的OAuth2认证与授权