3 votes

Comment vérifier la signature xmldsig en utilisant java.security

Je dois vérifier un document avec une signature enveloppée xml-dsig en utilisant le package java.security. Après avoir chargé, je désérialise le document et j'ai un objet Signature selon le schéma xsd - http://www.w3.org/2000/09/xmldsig#

Ensuite:

@Service
public class XmlSignatureCheckerImpl implements XmlSignatureChecker {
    private static final String ENCRYPTION_ALGORITHM = "RSA";

    private static final String HASH_ENCRYPTION_ALGORITHM = "SHA1withRSA";

    @Override
    @Nullable
    public PublicKey getPublicKey(byte[] exp, byte[] mod) {
        BigInteger modulus = new BigInteger(1, mod);
        BigInteger exponent = new BigInteger(1, exp);
        RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);

        KeyFactory fact;
        try {
            fact = KeyFactory.getInstance(ENCRYPTION_ALGORITHM);
            return fact.generatePublic(rsaPubKey);
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    @Nullable
    public Boolean verify(byte[] message, byte[] signature, PublicKey publicKey) {
        final Signature sig;
        try {
            sig = Signature.getInstance(HASH_ENCRYPTION_ALGORITHM);
            sig.initVerify(publicKey);
            sig.update(message);
            boolean verify = sig.verify(Base64.encodeBase64Chunked(signature));
            return verify;
        } catch (NoSuchAlgorithmException | SignatureException | InvalidKeyException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Appeler getPublicKey et verify, j'obtiens une discordance de longueur de signature, si je n'encode pas la signature je n'ai pas de discordance, mais la vérification est également fausse, pourtant j'utilise des données de test qui sont entièrement valides. J'abandonne la recherche de l'erreur, aidez-moi s'il vous plaît. L'encodage du fichier est UFT-8.

1voto

DouglasD Points 38

Avez-vous consulté la documentation officielle ? Il semble que travailler avec l'usine de signes soit un peu plus pratique http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html

De plus, j'ai trouvé ces exemples qui pourraient être utiles https://www.java-tips.org/java-ee-tips-100042/158-xml-digital-signature-api/1473-using-the-java-xml-digital-signature-api.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X