문제

이 단위 테스트는 실패합니다.

    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;

공개 클래스 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á

바이트 [] 소화를 문자열로 변환 할 때 올바른 인코딩 체계를 사용하고 있지 않다고 생각합니다. 모든 도움이 감사하겠습니다.

도움이 되었습니까?

해결책

당신이 기대하는 값은 16 진수로 인코딩 된 값입니다. 작동하지 않는 원시 바이트를 기반으로 문자열을 만들고 있습니다.

바운시 캐슬 특정 API 대신 가능할 때마다 표준 Java Crypto API를 사용해야합니다.

다음을 시도해보십시오 (HEX 라이브러리는 출처로 나옵니다 커먼즈 코데):

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

다른 팁

Kevin의 답변에 추가 : Java 5 이후로 사용할 수 있습니다. String.format("%0128x", new BigInteger(1, digesta)) Commons-Codec 대신 바이트 배열을 주요 0과 함께 128 자리 육각 인코딩 숫자로 포맷합니다.

예, 바이트 배열을 육각 문자열로 바꿔야합니다. :-) 들여다보다 Apache Commons Codec, 특히 마녀 수업.

Bouncycastle 1.49 이후에는 소수가 있습니다 toHexString 방법의 메소드 Hex 수업. 예를 들어:

Hex.toHexString(digest);

해시 다이제스트를 Java로 반환합니다 String 16 진 형식으로.

참조를 참조하십시오 Bouncycastle Javadoc 또는 grepcode.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top