De vérifier une signature avec château gonflable
J'ai hérité d'un code en utilisant le obsolète bouncycastle API. Avant de le mettre à jour vers la nouvelle API, je voulais écrire un test pour vérifier que je n'ai pas changer son comportement. Cependant, je ne peut pas travailler de la bonne façon de vérifier cette signature qui est généré. Le code à changé, c'est:
public static byte[] createSignedData(byte[] content, X509Certificate cert, PrivateKey key)
throws NoSuchAlgorithmException, NoSuchProviderException, CMSException, IOException {
//set up the generator
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(key, cert, CMSSignedGenerator.DIGEST_SHA1);
//create the signed-data object
CMSProcessable data = new CMSProcessableByteArray(content);
CMSSignedData signed = gen.generate(data, BC_PROVIDER);
return signed.getEncoded();
}
Ce qui est retournée à partir de ce code? Une signature détachée?
J'ai essayé de vérifier la signature avec un petit morceau de code comme ça, mais il renvoie toujours false:
Signature signer = Signature.getInstance(
"SHA1withRSA",
BouncyCastleProvider.PROVIDER_NAME);
signer.initVerify(cert.getPublicKey());
signer.update(data);
return signer.verify(sig);
Vous devez vous connecter pour publier un commentaire.
Il sera de retour une détaché signature si vous utilisez:
Sinon il sera de retour signé les données encapsulées dans la signature. Donc, si votre signature est détachée (qui n'est pas votre cas) pour le vérifier, il vous sera nécessaire de créer un nouveau
CMSSignedData
objet à partir de votre signée octets de données ouBase64
encondedstring
et aussi une copie de l'original des données, aussi bien dans le constructeur.Je pense que vous n'êtes pas à la vérification de votre signature le droit chemin, aussi je ne sais pas qui
bouncycastle
version de bibliothèque sont que vous utilisez et que vous venez de fournir un extrait de code qui est trop vague pour analyser.C'est ce que j'ai fait pour signer et vérifier une signature à l'aide de
bcmail-jdk16-1.46.jar
,bcprov-jdk16-1.46.jar
etjdk1.6.0_45
(je suis en supposant que vous utilisez Java depuis que vous avez jamais précisé, ce qui est également question tags - mais j'espère que .NET version est très similaire).Vous pouvez télécharger le keystore utilisé dans mon exemple à: https://dl.dropboxusercontent.com/u/15208254/keys/certificates.p12
Aussi, si vous voulez vérifier si la vérification de la signature fonctionne bien, vous pouvez modifier le certificat (depuis que je suis la vérification par rapport à mon propre certificat qui n'a pas de sens) en changeant cette ligne dans le processus de vérification de signature, la ligne 84:
Et puis le chargement d'un autre keystore pour obtenir un autre certificat d'elle. Juste pour savoir, le certificats.p12 dossier, je suis en utilisant, contient deux certificats avec alias
Key1
etKey2
de sorte que vous pouvez jouer avec eux par la signature de votre contenu avecKey1
et la vérification de votre signature avecKey2
par exemple.e.g:
Puis remplacer la ligne 84 avec ceci:
Avis que
certFromSignedData
changé àcertFromKeystore2
et votre signature vérification échoue parce que votre contenu a été signé avecKey1
.De code Java:
Ne pas oublier de changer le keystore chemin d'accès dans l'une des constantes!