Java/기본

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

vmpo 2021. 9. 15. 11:58

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

 

LIST