sprint安全性JWT实现是否可以应对alg:none攻击?

时间:2019-03-27 09:00:48

标签: spring spring-security jwt spring-security-rest

JWT实现可能会遭受不同的攻击,其中之一就是“ alg:none”攻击(请参阅here的更多详细信息)。 我在pom.xml文件中使用了“ spring-security-jwt”依赖项,但无法确定此实现是否处理“ alg:none”攻击。 Spring Security JWT的实施是否可以缓解这种攻击?

1 个答案:

答案 0 :(得分:3)

如果您使用的是spring-security-oauth / spring-security-jwt,那么可以,此攻击可以缓解。根据您共享的链接,减轻此攻击的一种方法是,在选择算法时,将带有"alg":"none"头的JWT令牌视为无效或不依赖于alg头。

在选择算法时,decode方法中的spring-security-jwt文件JwtHelper的源代码不依赖于alg头。

public static Jwt decode(String token) {
    int firstPeriod = token.indexOf('.');
    int lastPeriod = token.lastIndexOf('.');

    if (firstPeriod <= 0 || lastPeriod <= firstPeriod) {
        throw new IllegalArgumentException("JWT must have 3 tokens");
    }
    CharBuffer buffer = CharBuffer.wrap(token, 0, firstPeriod);
    // TODO: Use a Reader which supports CharBuffer
    JwtHeader header = JwtHeaderHelper.create(buffer.toString());

    buffer.limit(lastPeriod).position(firstPeriod + 1);
    byte[] claims = b64UrlDecode(buffer);
    boolean emptyCrypto = lastPeriod == token.length() - 1;

    byte[] crypto;

    if (emptyCrypto) {
        if (!"none".equals(header.parameters.alg)) {
            throw new IllegalArgumentException(
                    "Signed or encrypted token must have non-empty crypto segment");
        }
        crypto = new byte[0];
    }
    else {
        buffer.limit(token.length()).position(lastPeriod + 1);
        crypto = b64UrlDecode(buffer);
    }
    return new JwtImpl(header, claims, crypto);
}

spring-security-jwt中没有漏洞的文档或汇编,但您可以检查spring-security-jwt下的问题section并报告您认为需要修补的任何漏洞。