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.