Comment puis-je créer une chaîne digest SHA512 en Java en utilisant château gonflable?

StackOverflow https://stackoverflow.com/questions/2208374

Question

Ce test unitaire échoue:

    public void testDigest() throws NoSuchAlgorithmException {
    String hashExpected = "150a14ed5bea6cc731cf86c41566ac427a8db48ef1b9fd626664b3bfbb99071fa4c922f33dde38719b8c8354e2b7ab9d77e0e67fc12843920a712e73d558e197";
    MessageDigest md = new MessageDigest();
    String hashActual = new String(md.digest("hi"));
    Assert.assertEquals(hashExpected, hashActual);
}

Ci-dessous ma mise en œuvre de ma classe MessageDigest:


import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.SHA512Digest; import org.bouncycastle.crypto.io.DigestInputStream; import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class MessageDigest { private Digest messageDigest;

public MessageDigest() throws NoSuchAlgorithmException {
    Security.addProvider(new BouncyCastleProvider());
    messageDigest = new SHA512Digest();
}

public byte[] digest(String message) {
    byte[] retValue = new byte[messageDigest.getDigestSize()];
    messageDigest.update(message.getBytes(), 0, message.length());
    messageDigest.doFinal(retValue, 0);
    return retValue;
}

}

Le test échoue avec la raison suivante:


junit.framework.ComparisonFailure: expected:<150a14ed5bea6cc731cf86c41566ac427a8db48ef1b9fd626664b3bfbb99071fa4c922f33dde38719b8c8354e2b7ab9d77e0e67fc12843920a712e73d558e197> but was:<
í[êlÇ1φÄf¬Bz�´Žñ¹ýbfd³¿»™¤É"ó=Þ8q›ŒƒTâ·«�wàæÁ(C’
q.sÕXá

J'ai un sentiment que je ne suis pas en utilisant le schéma de codage à droite quand je convertir mon octet [] digérer dans une chaîne. Toute aide serait appréciée.

Était-ce utile?

La solution

La valeur que vous vous attendez à une valeur codée Hex. Vous créez une chaîne sur la base des octets bruts, qui ne fonctionnera pas.

Vous devez utiliser l'API Java standard Crypto chaque fois que possible au lieu d'API spécifiques bouncycastle.

Effectuez les opérations suivantes (la bibliothèque Hex vient de ):

Security.addProvider(new BouncyCastleProvider());

String data = "hello world";

MessageDigest mda = MessageDigest.getInstance("SHA-512", "BC");
byte [] digesta = mda.digest(data.getBytes());

MessageDigest mdb = MessageDigest.getInstance("SHA-512", "BC");
byte [] digestb = mdb.digest(data.getBytes());

System.out.println(MessageDigest.isEqual(digesta, digestb));

System.out.println(Hex.encodeHex(digesta));

Autres conseils

Juste un ajout à la réponse de Kevin:. Depuis Java 5, vous pouvez utiliser String.format("%0128x", new BigInteger(1, digesta)) au lieu de commons-codec pour formater le tableau d'octets en hexadécimal de 128 chiffres nombre codé par des zéros

Oui, vous avez besoin pour transformer votre tableau d'octets dans une chaîne hexagonale. :-) Regardez dans Apache Commons Codec , en particulier les Hex classe.

Depuis BouncyCastle 1,49 il y a une poignée de méthode toHexString dans la classe Hex. Par exemple:

Hex.toHexString(digest);

vous retourner le résumé de hachage comme String Java dans un format hexadécimal.

Pour référence, voir BouncyCastle javadoc ou grepcode .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top