使用 jose4j 验证具有分离负载的 JWS 失败
Verifying JWS with detached payload using jose4j fails
我在验证具有分离负载的 JWS 时遇到问题。我基本上复制了 jose4j 文档中 example provided 中的所有步骤,但出于某种原因验证仍然 returns false 虽然它应该成功。
这是我使用的代码,使用最新版本的 jose4j。
// signature is the complete JWS in the form: "JOSE Header".."JWS Signature"
// payload is the unencoded JSON string that makes up the request body
public boolean verifySignature(String signature, String payload) {
JsonWebSignature jws = new JsonWebSignature();
jws.setKnownCriticalHeaders(critHeaders); //critical headers from documentation
//Algorithm as provided in documentation
jws.setAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.PERMIT,
AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256));
jws.setPayload(payload);
try {
jws.setCompactSerialization(signature);
String keyId = jws.getKeyIdHeaderValue();
String keyType = jws.getKeyType();
String keyAlg = jws.getAlgorithmHeaderValue();
//Retrieve key from cached jwks
JsonWebKey usedKey = jwks.findJsonWebKey(keyId, keyType, "sig", keyAlg);
jws.setKey(usedKey.getKey());
return jws.verifySignature();
} catch (JoseException e) {
//log
return false;
}
}
尝试将 jws.setPayload(payload);
向下移动到 jws.setCompactSerialization(...);
行之后。
我认为 jws.setCompactSerialization(...);
将有效负载覆盖为空字符串,这会破坏签名验证。
Brian Campbell 在 jose4j Bitbucket 上研究了这个问题,这是他的解决方案
adding a jws.setEncodedPayload(null); right after jws.setCompactSerialization(signature); will make it work.
显然 encoded/unencoded 负载
在我的用例中存在一些不一致
我在验证具有分离负载的 JWS 时遇到问题。我基本上复制了 jose4j 文档中 example provided 中的所有步骤,但出于某种原因验证仍然 returns false 虽然它应该成功。
这是我使用的代码,使用最新版本的 jose4j。
// signature is the complete JWS in the form: "JOSE Header".."JWS Signature"
// payload is the unencoded JSON string that makes up the request body
public boolean verifySignature(String signature, String payload) {
JsonWebSignature jws = new JsonWebSignature();
jws.setKnownCriticalHeaders(critHeaders); //critical headers from documentation
//Algorithm as provided in documentation
jws.setAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.PERMIT,
AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256));
jws.setPayload(payload);
try {
jws.setCompactSerialization(signature);
String keyId = jws.getKeyIdHeaderValue();
String keyType = jws.getKeyType();
String keyAlg = jws.getAlgorithmHeaderValue();
//Retrieve key from cached jwks
JsonWebKey usedKey = jwks.findJsonWebKey(keyId, keyType, "sig", keyAlg);
jws.setKey(usedKey.getKey());
return jws.verifySignature();
} catch (JoseException e) {
//log
return false;
}
}
尝试将 jws.setPayload(payload);
向下移动到 jws.setCompactSerialization(...);
行之后。
我认为 jws.setCompactSerialization(...);
将有效负载覆盖为空字符串,这会破坏签名验证。
Brian Campbell 在 jose4j Bitbucket 上研究了这个问题,这是他的解决方案
adding a jws.setEncodedPayload(null); right after jws.setCompactSerialization(signature); will make it work.
显然 encoded/unencoded 负载
在我的用例中存在一些不一致