Frage

Diese Einheit Test versagt:

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

Im Folgenden finden Sie meine Umsetzung meiner Message Klasse:


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;
}

}

Der Test schlägt mit dem folgenden Grund:


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

Ich habe das Gefühl, ich bin das richtige Codierungsschema nicht verwenden, wenn ich meine byte [] in einen String verdauen konvertieren. Jede mögliche Hilfe würde geschätzt.

War es hilfreich?

Lösung

Der Wert Sie erwarten, ist ein Hex-codierten Wert. Sie erstellen einen String auf der Basis der rohen Bytes, die nicht funktionieren wird.

Sie sollten den Standard-Java-Crypto API, wann immer möglich, anstelle von BouncyCastle spezifischen APIs.

Versuchen Sie, die folgenden (die Hex-Bibliothek stammt aus commons-codec ):

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));

Andere Tipps

Nur eine Ergänzung zu Kevins Antwort. Da Java 5, Sie String.format("%0128x", new BigInteger(1, digesta)) statt commons-Codec verwenden können, das Byte-Array als 128 digit hex codierte Zahl mit führenden Nullen zu formatieren

Ja, müssen Sie Ihren Byte-Array in einen Hex-String drehen. Schauen :-) in Apache Commons Codec , vor allem die Hex Klasse.

Da BouncyCastle 1.49 gibt es eine Handvoll toHexString Methode in der Hex Klasse. Zum Beispiel:

Hex.toHexString(digest);

kehren Sie den Hash-Digest als Java String in einem Hexadezimal-Format.

Als Referenz finden Sie unter BouncyCastle javadoc oder grepcode .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top