【问题标题】:Spring Boot API how to validate NONCE value sent in request header to avoid replay attacksSpring Boot API如何验证请求标头中发送的NONCE值以避免重放攻击
【发布时间】:2021-01-15 09:12:49
【问题描述】:

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

我想知道是否有检查标头中收到的 Nonce 的标准方法。我想避免使用 Nonce 进行重放攻击。

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

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

MySecurityFilter

@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 验证,因为我的用例中不需要它。

【问题讨论】:

    标签: spring spring-boot security nonce api-security


    【解决方案1】:

    检查下面的 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 与请求时间戳一起验证,因此您可以简单地拒绝时间戳早于配置时间间隔的请求。

    NONCE 的持久性也取决于您的基础设施。如果您在基础设施中使用诸如 hazelcast/infispin 之类的 IMDG 或任何其他缓存,您可以利用它们来实现持久性,并利用 TTL 来实现 nonce。

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

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        相关资源
        最近更新 更多