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

Spring Boot API how to validate NONCE value sent in request header to avoid replay attacks

我有一个 Spring 带有自定义身份验证的启动应用程序。我正在使用 Servlet 过滤器拦截 API 请求并验证发送的请求令牌。我还在客户端请求 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 安全性进行 API 验证,因为它在我的用例中不需要。

你可以看看这段代码。我认为其中的一部分对您有价值。

https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/security/impl/SimpleNonceManager.java

检查下面的 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 命令或使用 pgAgent 来达到 Postgres DB 的目的。

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