Как я могу создать строку дайджеста SHA512 в Java с помощью бодрого замка?

Этот модульный тест перестал работать:

    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;

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

}

Тест перестал работать со следующей причиной:


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

У меня есть чувство, что я не использую правильную схему кодирования, когда я преобразовываю свой байт [] обзор в строку. Любая справка ценилась бы.

11
задан Lee Warner 5 February 2010 в 15:55
поделиться

3 ответа

Ожидаемое значение является значением в шестнадцатеричной кодировке. Вы создаете String на основе необработанных байтов, что не сработает.

По возможности следует использовать стандартный Java Crypto API вместо специальных API BouncyCastle.

Попробуйте следующее (библиотека Hex взята из 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));
34
ответ дан 3 December 2019 в 00:46
поделиться

Просто дополнение к ответу Кевина: начиная с Java 5, вы можете использовать String.format ("% 0128x", новый BigInteger (1, дайджест) )) вместо обычного кодека для форматирования массива байтов как 128-значного шестнадцатеричного числа с ведущими нулями.

22
ответ дан 3 December 2019 в 00:46
поделиться

Да, вам нужно преобразовать массив байтов в шестнадцатеричную строку. :-) Посмотрите Кодек Apache Commons , особенно класс Hex .

3
ответ дан 3 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: