の作成方法を教えてくださいSHA512ダイジェスト文字列をJavaを使用弾む城?
-
18-09-2019 - |
質問
このユニットテストは失敗:
public void testDigest() throws NoSuchAlgorithmException {
String hashExpected = "150a14ed5bea6cc731cf86c41566ac427a8db48ef1b9fd626664b3bfbb99071fa4c922f33dde38719b8c8354e2b7ab9d77e0e67fc12843920a712e73d558e197";
MessageDigest md = new MessageDigest();
String hashActual = new String(md.digest("hi"));
Assert.assertEquals(hashExpected, hashActual);
}
以下が私の実施のMessageDigestクラス:
import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
輸入org.bouncycastle.crypto.ダイジェスト;輸入org.bouncycastle.crypto.ダイジェスト.SHA512Digest;輸入org.bouncycastle.crypto.io.DigestInputStream;輸入org.bouncycastle.jce.プロバイダです。BouncyCastleProvider;
公MessageDigestクラス{
民間のダイジェスト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;
}
}
でのテストは失敗し、以下の理由
junit.framework.ComparisonFailure: expected:<150a14ed5bea6cc731cf86c41566ac427a8db48ef1b9fd626664b3bfbb99071fa4c922f33dde38719b8c8354e2b7ab9d77e0e67fc12843920a712e73d558e197> but was:<
í[êlÇ1φÄf¬Bz�´Žñ¹ýbfd³¿»™¤É"ó=Þ8q›ŒƒTâ·«�wàæÁ(C’
q.sÕXá
思いの符号化時の変換マbyte[]ダイジェストに文字列になります。の手によりお願い申し上げます。
解決
あなたが期待している値は、16進数の値です。あなたは動作しません生のバイトに基づいて文字列を作成しています。
あなたは代わりにはBouncyCastle固有のAPIの標準的なJavaのCrypto APIを可能な限りを使用する必要があります。
(16進数のライブラリはコモンズ・コーデックのから来ている)次のことを試してください:
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));
他のヒント
ケビンの答えにジャストほか:Java 5のは、あなたが先頭にゼロと128桁の進エンコードされた数としてバイト配列をフォーマットする代わりコモンズ・コーデックのString.format("%0128x", new BigInteger(1, digesta))
を使用することができますので、
はい、あなたは16進文字列にあなたのバイト配列を有効にする必要があります。 :-)、ののApache Commonsのコーデックに特に<のhref = "HTTPを見て://コモンズ.apache.org /コーデック/ API放出/ ORG /アパッチ/コモンズ/コーデック/バイナリ/ Hex.html」REL = "nofollowをnoreferrer">六角のクラス
以来、BouncyCastle1.49があるほんの一握り toHexString
方法の Hex
クラスです。例えば:
Hex.toHexString(digest);
まだ帰りのハッシュダイジェストとしてJava String
に進数形式です。
を参照。 BouncyCastle javadoc または grepcode.