블록체인에서 가장 많이 사용하고 있는 해싱 알고리즘인 sha-256 알고리즘을 java로 구현 해보도록 하겠습니다.
1. sha256으로 해싱
java 기본 클래스인 MessageDigest 를 활용한다.
-MessageDigest 객체 생성
-변환할 스트링을 바이트로 변환하여 digest() 메소드의 파라미터로 던짐
-bytesToHex 메소드로 바이트를 16진수 스트링으로 변환함 (해당 메소드는 새로 구현해야됨, 아래 참고)
public static String Sha256(String originalString) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedhash);
}
2. 바이트로 해싱된 데이터를 16진수 스트링으로 변환
전달받은 바이트 값을 16진수로 변환해준다.
0xff & hash[i] 는 16진수 변환을 위한 조작인데,
hash[i] 값이 음수일 경우 양수로 변환하기 위한 작업이다. 바이트의 경우 비트로 표현하면 8bit 이지만, 제일 앞자리를 부호비트로 사용하기 때문에 10진수 표현 범위는 -128~ 127이다. ( 1111 1111 일 경우 제일 앞자리를 부호비트로 사용해 255가 아닌 -1로 표현됨.)
0xff는 비트로 표현하면 1111 1111 10진수로 표현하면 255이다. 즉, int 타입으로 처리된다.
즉, int는 4byte로 비트로 표현하면 32bit이다. (0000 0000 0000 0000 0000 0000 1111 1111) 이 되며,
위 32bit 값과 전달받은 byte와 and 연산을 시켜 양수로 표현이 되게 된다.
-1 & 0xff 를 할경우 255으로 변환됨.
ex) 0000 0000 0000 0000 0000 0000 1111 1111 -> (0xff)
and 1111 1111 1111 1111 1111 1111 1111 1111 -> -1
=. 0000 0000 0000 0000 0000 0000 1111 1111 ( 10진수 255 , 양수로 변환됨)
public static String bytesToHex(byte[] hash) {
StringBuilder hexString = new StringBuilder(2 * hash.length);
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
3. 전체 소스코드 및 수행 결과
"test" 라는 스트링 값을 sha256 변환을 진행해 보면 아래와 같이 출력 값을 확인 할 수 있다.
'Java > 기본' 카테고리의 다른 글
[java] java stream sorted() 활용하기 (0) | 2021.10.01 |
---|---|
[java] Stream api 사용하기 - 02 (0) | 2021.10.01 |
[java] Stream api 사용하기 - 01 (0) | 2021.09.14 |
[java] 상속의 개념 알아보기 (0) | 2020.03.21 |
[java] cpu, memory usage monitoring sample (0) | 2019.10.20 |
최근댓글