on
[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