[java] sha-256 해싱 알고리즘 사용하기

[java] sha-256 해싱 알고리즘 사용하기

반응형

블록체인에서 가장 많이 사용하고 있는 해싱 알고리즘인 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 변환을 진행해 보면 아래와 같이 출력 값을 확인 할 수 있다.

반응형

from http://vmpo.tistory.com/111 by ccl(A) rewrite - 2021-09-15 12:01:39