Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot API如何验证请求头中发送的NONCE值以避免重播攻击_Spring_Spring Boot_Security_Nonce_Api Security - Fatal编程技术网

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

Spring Boot API如何验证请求头中发送的NONCE值以避免重播攻击,spring,spring-boot,security,nonce,api-security,Spring,Spring Boot,Security,Nonce,Api Security,我有一个带有自定义身份验证的Spring启动应用程序。我使用Servlet过滤器拦截API请求,并验证发送的请求令牌。我还从客户端请求请求头中的Nonce,这是客户端在每个API调用中发送的唯一值 我想知道是否有一种标准的方法来检查头中收到的Nonce。我想避免使用Nonce进行重播攻击 我能想到的一个实现是——在请求中存储收到的Nonce 1分钟/在内存中保持100个请求的LRU缓存,并确保不再收到它 如果你能给我指出一些好的资源,让我了解检查Nonce的好方法,那会很有帮助 MySecuri

我有一个带有自定义身份验证的Spring启动应用程序。我使用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 security进行API验证,因为在我的用例中它不是必需的。

您可以看看这段代码。在我看来,这其中的一部分对你来说是有价值的


查看下面的MemoryNonceServices,它有助于示例实现

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

NONCE的持久性也取决于您的infra。如果您在infra中使用IMDG,如hazelcast/infispin或任何其他缓存,您可以利用它们进行持久化,暂时使用TTL

使用DB,您可能需要编写一个定制的TTL解决方案,该解决方案可以简单到根据当前时间检查创建的时间戳

例如:您可以运行定时cron作业来调度简单的删除命令,或者在Postgres DB的情况下使用pgAgent

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