Spring Boot API 如何验证请求 header 中发送的 NONCE 值以避免重放攻击

标签 spring spring-boot security nonce api-security

我有一个带有自定义身份验证的 Spring Boot 应用程序。我正在使用 Servlet 过滤器拦截 API 请求并验证发送的请求 token 。我还在客户端的请求 header 中请求 Nonce,这是在每次 API 调用中从客户端发送的唯一值。

我想知道是否有一种标准方法来检查 header 中收到的 Nonce。我想使用 Nonce 避免重放攻击。

我能想到的一个实现是 - 将请求中收到的 Nonce 存储 1 分钟/在内存中维护 100 个请求的 LRU 缓存,并确保不再收到它。

如果您能为我指出一些好的资源以提供检查 Nonce 的好方法,那将会很有帮助。

我的安全过滤器

@Component
@Order(1)
public class MySecurityFilter implements Filter {

    private static final Logger LOGGER = LoggerFactory.getLogger(MySecurityFilter.class);
    private static final String NONCE_PARAMETER_NAME = "x-nonce";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String nonce = getHeaderValue(req, NONCE_PARAMETER_NAME);
                
        //TODO: Validate Nonce

        chain.doFilter(request, response); 
    }
    //...
 }

PS:我没有使用 Spring Security 进行 API 验证,因为我的用例不需要它。

最佳答案

检查下面的 InMemoryNonceServices,它有助于示例实现。

https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth/src/main/java/org/springframework/security/oauth/provider/nonce/InMemoryNonceServices.java

理想情况下,随机数与请求时间戳一起进行验证,因此您可以简单地拒绝时间戳早于配置间隔的请求。

NONCE 的持久性也取决于您的基础设施。如果您在基础设施中使用像 hazelcast/infispin 这样的 IMDG 或任何其他缓存,您可以利用它们实现持久性和 TTL 随机数。

使用 DB,您可能必须编写一个自定义 TTL 解决方案,这可能就像根据当前时间检查创建的时间戳一样简单。

例如。 :您可以运行计划的 cron-job 来安排简单的 DELETE 命令,或者在 Postgres DB 的情况下使用 pgAgent。

AWS Dynamo DB 等云数据存储也提供 TTL,但可能不会在到期时准确删除数据。

关于Spring Boot API 如何验证请求 header 中发送的 NONCE 值以避免重放攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64125012/

相关文章:

spring cloud 配置服务器 - 没有这样的标签 : master

java - 一起使用@Scheduled 和@Async?

python - 如何通过 SSH 将密码作为参数安全地传递给 Python 脚本?

java - Spring Boot——根据操作系统自动激活profile

java - iBatis,spring,如何记录执行的sql?

postgresql - 无法通过 Spring Boot 将 Docker Desktop Kubernetes (Windows) 服务连接到本地 Postgres 数据库

php - 使用 mysql 排序规则的安全问题/sql 注入(inject)?

java - 防止共享 Java 库

java - 如何使用 Spring AOP 建议静态方法?

java - 如何将 Spring Controller /模型中的错误传递到 View 文件