BouncyCastle: PKCS#7 + message digest MD5: comment vérifier la signature ?
Bonjour,
J'utilise la librairie BouncyCastle pour la première fois, et je n'ai pas fait des tonnes de crypto avant... mon pb est donc peut-être tout simple, mais je ne comprends pas comment le résoudre... :-(
Je suis en train de développer un bout de code qui doit vérifier la signature de 6 paramètres envoyés par un client tiers.
Les spécifications du client sont:
- 6 mots (texte pur) sont utilisés pour générer un message digest avec l'algorithme MD5
- ce message digest est ensuite signé avec PKCS#7
- la clé publique est un certificat X.509 v3 (stocké sur le serveur)
Côté serveur, je reçois les 6 mots en texte clair et la signature générée par PKCS#7.
J'ai deux questions:
1. est-ce que l'idée de base de mon code est correcte:
- regénérer le message digest sur la base des 6 mots
- confronter la signature reçue avec ce message digest
2. quand j'exécute mon bout de code, j'ai une exception: SignatureException: content hash found in signed attributes different.
Je ne comprends pas ce qu'elle signifie :-( (Google ne m'a pas été d'un grand secours sur ce coup).
Est-ce que quelqu'un pourrait m'expliquer ce que ça veut dire et comment résoudre ce problème ?
Merci beaucoup !!!!
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public static boolean checkSign(String word1, String word2, String word3, String word4, String word5, String word6, String receivedSignature) {
// Add a Bouncy Castle security provider
Security.addProvider(new BouncyCastleProvider());
FileInputStream certifIS = new FileInputStream("myCert.cer");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Collection c = cf.generateCertificates(certifIS);
certifIS.close();
Iterator iterator = c.iterator();
X509Certificate cert = null;
while (iterator.hasNext()) {
cert = (X509Certificate)iterator.next();
}
MessageDigest sha = MessageDigest.getInstance("MD5");
sha.reset();
sha.update(word1.getBytes());
sha.update(word2.getBytes());
sha.update(word3.getBytes());
sha.update(word4.getBytes());
sha.update(word5.getBytes());
sha.update(word6.getBytes());
byte[] hash = sha.digest();
byte signedContent[] = Base64.decode(receivedSignature);
CMSSignedData signedData = new CMSSignedData(signedContent);
if (signedData.getSignedContent() == null){
CMSProcessableByteArray process = new CMSProcessableByteArray(hash);
signedData = new CMSSignedData(process, signedContent);
}
SignerInformation signer = (SignerInformation) signedData.getSignerInfos().getSigners().iterator().next();
boolean isOk = signer.verify(cert, "BC");
return isOk;
} |