2

切り離されたペイロードを持つ JWS の検証で問題が発生しています。jose4j ドキュメントで提供されている例のすべての手順を基本的にコピーしましたが、何らかの理由で、検証は成功するはずなのに 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;
        }       
    }
4

2 に答える 2

0

Brian Campbell は jose4j Bitbucket でこれを調べました。これが彼の解決策です

jws.setEncodedPayload(null) を追加します。jws.setCompactSerialization(signature); の直後 それを機能させます。

私のユースケースでは、エンコードされたペイロードとエンコードされていないペイロードの間に矛盾があるようです

于 2022-01-24T09:59:37.850 に答える