[Java] SHA-256 해싱(Hashing) 알고리즘

Yeoonnii·2023년 3월 5일
1

Java

목록 보기
28/30
post-thumbnail

SHA-256의 개념과 SHA-256 해싱 알고리즘을 사용한 해시함수를 구현해보았다.


SHA-256 등장 배경

SHA는 Secure Hash Algorithm의 약자를 의미한다.
미국 국가안보국(NSA)가 1993년에 처음으로 설계했으며 미국 국가 표준으로 지정되었다.

최초의 함수는 SHA-0라고 불리며 2년 후 SHA-1이 발표되었고,
이후에 SHA-224, SHA-256, SHA-384, SHA-512가 더 발표되었다.
(이 네개를 통칭해 SHA-2라고 부르기도 한다.)

2012년에 Keccak이라고 부르는 알고리즘이 SHA-3로 선정되며,
SHA-3는 SHA-2와 해시 길이가 동일하지만 내부적으로는 완전히 다르다.



SHA-256 이란?

SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 메시지, 파일, 혹은 데이터 무결성 검증에 널리 사용된다.

이름에 내포되어 있듯 2²⁵⁶ 만큼 경우의 수를 만들수 있으며,
어떤 길이의 값을 입력하더라도 256비트로 구성된 64자리 문자열을 고정값으로 반환한다.

일반적으로 입력값이 조금만 변동하여도 출력값이 완전히 달라지기 때문에 출력값을 토대로 입력값을 유추하는 것은 거의 불가능하다.

SHA-256은 현재 블록체인에서 가장 많이 채택하여 사용되고 있는 암호 방식이다.
출력 속도가 빠르다는 장점을 갖고 있다. 속도가 빠르기 때문에 인증서, 블록체인 등 많이 사용되고있으며 상용화가 잘 되어있다.

또한 단방향성의 성질을 띄고 있는 암호화 방법으로 복호화가 불가능하다.



단방향 알고리즘(One-Way) 암호화

단방향 알고리즘(One-Way) 암호화는 평문을 암호화했을 때 다시 평문으로 복호화할 수 없는 암호화이다. 대표적으로 많이 사용되는 알고리즘이 SHA-256 암호화 알고리즘이다.

SHA-256은 데이터의 수정과 변경을 검출 할 수 있으나 인증은 불가능하다. 인증에 사용하기 위해 메시지 인증 코드와 디지털 서명이 요구된다.

JAVA/SHA-256 사용예제

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class main {
    public static void main(String[] args) throws Exception {
        System.out.println(sha256("needjarvis"));        
    }
  
    /**
     * SHA-256으로 해싱하는 메소드
     * 
     * @param bytes
     * @return
     * @throws NoSuchAlgorithmException 
     */
    public static String sha256(String msg) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(msg.getBytes());
        
        return bytesToHex1(md.digest());
    }
   
    /**
     * 바이트를 헥스값으로 변환한다.
     * 
     * @param bytes
     * @return
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder builder = new StringBuilder();
        for (byte b: bytes) {
          builder.append(String.format("%02x", b));
        }
        return builder.toString();
    }
}

JAVA/SHA-256 구현해보기

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

// SHA256 알고리즘을 사용한 해시함수
public class Sha256EncryptUtil {

	// 1. 메시지 다이제스트를 문자열로 return
	public static String ShaEncoder(String userPw) {
		try {
			// 알고리즘을 "SHA-256"으로 하여 MessageDigest 객체 생성
			MessageDigest digest = MessageDigest.getInstance("SHA-256");
			
			// 해시된 데이터는 바이트 배열의 바이너리 데이터이다.
			 byte[] hash = digest.digest(userPw.getBytes(StandardCharsets.UTF_8));
			 
			 StringBuilder hexString = new StringBuilder();
			 	// 바이트 배열을 16진수(hex) 문자열로 변환
			 for (byte b : hash) {	//hash에서 데이터를 꺼내 b에 담는다.
				//byte 8비트 ->int 32bit 형변환 시 앞의 18비트가 19번째 비트와 같은 값으로 채우는데 
		        //이 경우에 원본 값과 다른 경우가 되는 것을 방지하기 위한 연산이다.
				String hex = Integer.toHexString(0xff & b);
				
				if (hex.length() == 1) {
					hexString.append('0');
				}
				 	hexString.append(hex);
			 }
			 return hexString.toString();
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
	}
	
	// 2. 메시지 다이제스트를 바이트 배열로 return
	public static byte[] shaEncoderByte(String message) {
		// 이 메소드는 바이트배열을 16진수 문자열로 변환하지 않음
		try {
			MessageDigest digest = MessageDigest.getInstance("SHA-256");
			byte[] hash = digest.digest(message.getBytes(StandardCharsets.UTF_8));
			return hash;
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
	}
	
}

🌍참고링크
[블록체인] SHA-256 해시 알고리즘에 대해 알아보자
해시넷 위키
[Java] SHA-256 해싱 알고리즘 사용법
[java] sha-256 해싱 알고리즘 구현

0개의 댓글