该单元的测试失败:

    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;

进组织。bouncycastle.密码.摘要;进组织。bouncycastle.密码.摘要。SHA512Digest;进组织。bouncycastle.密码.io.DigestInputStream;进组织。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á

我有一种感觉我没有使用正确的编码方案时,我把我的字节[]摘要成一串。任何帮助,将不胜感激。

有帮助吗?

解决方案

你在期望的值是十六进制编码的值。您是根据原始字节,这将无法正常工作创建一个字符串。

您应该使用标准的Java加密API只要有可能,而不是BouncyCastle的特定API。

尝试使用以下(十六进制库来源于公地编解码器):

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,可以使用String.format("%0128x", new BigInteger(1, digesta))代替公地编解码器的字节数组作为带前导零的一个128位的十六进制编码的数字格式

是的,你需要把你的字节列入一个hex string.:-)看看 Apache共同编, 尤其是 Hex 类。

由于BouncyCastle1.49有一把 toHexString 方法在 Hex 类。例如:

Hex.toHexString(digest);

将返回你的散列的摘要作为一个Java String 在进制格式。

供参考见 BouncyCastle如果是的话,为什么不试grepcode.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top