2016-12-23 1 views
2

Je dois vérifier une signature dans java. Je reçois une URL avec plusieurs paramètres, l'un d'entre eux est la signature (format hexadécimal). Le message signé est le hachage SHA-256 de la concaténation de tous les autres paramètres. J'ai aussi le certificat avec la clé publique à utiliser pour le contrôle. Toutes les valeurs que j'utilise pour le test me sont données par un exemple qui est supposé être correct, je crée juste la chaîne de concaténation.La longueur de la signature n'est pas correcte

Voici le code i exécuté:

// signed message --> hash of concat 
MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
digest.update(concat.getBytes()); 
byte[] message = digest.digest(); 
System.out.println("message length "+message.length); // --> 32 


// signature belonging to the message --> checkValue 
System.out.println("check value length " +checkValue.length()); // --> 512 
byte[] sigBytes = checkValue.getBytes(); 
System.out.println("check value bytes "+sigBytes.length); // --> 512 

// public certificate of the CA 
File file3 = new File(certificatePath); 
byte[] encCertRSA = new byte[(int) file3.length()]; 
FileInputStream fis3 = new FileInputStream(file3); 
fis3.read(encCertRSA); 
fis3.close(); 
InputStream is = new ByteArrayInputStream(encCertRSA); 

CertificateFactory f = CertificateFactory.getInstance("X.509"); 
X509Certificate certRSA = (X509Certificate)f.generateCertificate(is); 
certRSA.checkValidity(); 
PublicKey pubKeyRSA = certRSA.getPublicKey(); 

Signature sig = Signature.getInstance("SHA256withRSA"); 
sig.initVerify(pubKeyRSA); 

// supply the Signature object with the data for which a signature was generated --> hash of concat 
sig.update(message); 

boolean isValid = sig.verify(sigBytes); 

System.out.println("The signature of the email verifies: " + isValid); 

Ceci est l'erreur que je reçois:

java.security.SignatureException: Signature length not correct: got 512 but was expecting 256 
at sun.security.rsa.RSASignature.engineVerify(Unknown Source) 
at java.security.Signature$Delegate.engineVerify(Unknown Source) 
at java.security.Signature.verify(Unknown Source) 

Est-ce que je fais quelque chose de mal? Je m'attendais à ce que la signature ait une longueur de 256, pas 512. Je lance un test en faisant une sous-chaîne de la valeur de signature pour correspondre à la longueur de 256 et je n'obtiens pas l'erreur ci-dessus, mais le sig.verify renvoie false .

Répondre

-1

si vous regardez le code que vous avez écrit il y a System.out.println("check value bytes "+sigBytes.length); // --> "512" puis boolean isValid = sig.verify(sigBytes); il semble que votre variable de sigBytes a déjà 512 en longueur avant de vérifier

+0

Oui, je voudrais comprendre si les valeurs que je reçois de la exemple sont faux ou si je manque quelque chose .. – user4219558

+0

il semble que vos valeurs soient fausses ou viennent ici mal parce que vous ne changez rien pour les variables 'sigBytes' et' checkValue'. Peut-être que vous pouvez vérifier la valeur de la classe qui envoie la variable checkValue 'value. –