Comment puis-je créer un SHA512 digérer chaîne de caractères en Java à l'aide de château gonflable?
Ce test est un échec:
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 est ma mise en œuvre de mon MessageDigest classe:
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 droit de schéma d'encodage lorsque je convertis un byte[] digérer en une chaîne de caractères. Toute aide serait appréciée.
OriginalL'auteur Lee Warner | 2010-02-05
Vous devez vous connecter pour publier un commentaire.
La valeur que vous attendez est codé en Hexadécimal valeur. Vous êtes en train de créer une Chaîne basée sur le raw en octets, ce qui ne fonctionne pas.
Vous devez utiliser le standard Java API Crypto chaque fois que possible au lieu de BouncyCastle des Api spécifiques.
Essayez les solutions suivantes (l'Hex de la bibliothèque vient de communes-codec):
Ils sont fonctionnellement équivalentes. MessageDigest#isEqual() fournit un peu plus de sens sémantique, mais qui est discutable.
Ils ne sont pas totalement équivalentes. Les Tableaux De.est égal à des méthodes de tenir compte de deux références nulles à être égaux, alors que le MessageDigest.isEqual de la méthode de jeter une NullPointerException.
Communes Codec n'est pas nécessaire pour l'hex de conversion. Essayez
System.out.println(new BigInteger(1,m.digest(new byte[]{0x00})).toString(16));
Concernant MessageDigest#isEqual(): Elle est constante de temps, c'est à dire il faut le même temps pour les calculer, et ne retourne pas false dès qu'il voit une différence. De cette façon, vous ne pouvez pas le temps de l'appel de la fonction pour vérifier si vous avez une table de hachage qui a un certain préfixe commun avec le nécessaire de hachage.
OriginalL'auteur Kevin
Simplement un ajout à Kevin réponse: Depuis Java 5, vous pouvez utiliser
String.format("%0128x", new BigInteger(1, digesta))
à la place des communes-le codec pour le format du tableau d'octets 128 chiffres hex codé nombre de zéros.Probablement pas.
OriginalL'auteur jarnbjo
Oui, vous avez besoin pour transformer votre tableau d'octets en une chaîne hexadécimale. 🙂 Regardez dans Apache Commons Codec, en particulier la Hex classe.
OriginalL'auteur Chris Jester-Young
Depuis BouncyCastle 1.49 il ya une poignée
toHexString
méthode dans leHex
classe. Par exemple:va vous retourner le hachage digérer comme Java
String
dans un format hexadécimal.Pour référence, voir BouncyCastle javadoc ou grepcode.
OriginalL'auteur Diego