본문으로 바로가기

[JAVA] 자바 SHA 암호화 하기 (SHA1, SHA2, SHA3)

category Backend/Java 2021. 8. 15. 15:10

목차

    0. SHA 암호화 들어가기 전에

    0.1. SHA 암호화 란?

    - Secure Hash Algorithm

    - MD5의 취약성을 개선 및 대처하기 위해 미국 국가안보국(NSA)이 1993년에 처음으로 설계했으며 미국 국가 표준으로 지정되었습니다.

    - 해시 값의 크기는 SHA 알고리즘에 따라오는 bit 수만큼 달라지게 됩니다. 

    - 해시 함수의 버전은 SHA 0 ~ SHA 3까지 있으며, 현재는 SHA2가 사용 가능하고, SHA3가 권장되고 있으며, SHA0과 1은 사용하지 않도록 하고 있습니다.

    - SHA0, SHA1은 충돌 발견되었습니다.

    - SHA-1은 SHA 함수들 중 가장 많이 쓰이며, TLS, SSL, PGP, SSH, IPSec 등 많은 보안 프로토콜과 프로그램에서 사용되고 있습니다.

    - SHA-224, SHA-256, SHA-384, SHA-512를 통칭해서 SHA-2라고 하기도 합니다.

    - SHA-256은 가장 많은 분야에서 채택하여 사용되고 있는 암호 방식으로 출력 속도가 빠르기 때문에 인증서, 블록체인 등 많이 사용되고 있으며, SHA-2라고 하면 SHA-256이라고 말할 정도로 상용화가 잘 되어있습니다.

     

    SHA 종류

    0.2. 준비하기

    - 암호화에 Java 기본 라이브러리(java.security.MessageDigest)를 사용합니다.

    - JDK 9 이상을 사용하셔야 SHA-3 암호 알고리즘을 사용할 수 있습니다.

      (필자는 java-11-openjdk-11.0.12.7-1.windows.ojdkbuild.x86_64를 이용했습니다.)

    - 암호화 한 값을 출력(인코딩)을 위해 Apache Commons 라이브러리를 사용합니다(다운로드 필요!).

     

    프로젝트 자바 추가, 변경 및 적용을 모를 경우 아래의 링크를 참조해주세요.

     

    [Spring] STS 4 (Spring Tool Suite 4) JRE 변경 (installed JREs) - JDK 변경, 추가

    목차 0. 설정에 들어가기 전에 - JRE 란? : Java Runtime Environment : 자바로 만들어진 프로그램을 실행시켜주는 환경을 구성해주는 도구입니다. - JDK 란? : Java Development Kit : JRE와 Java 바이트코드..

    veneas.tistory.com

     

    [Spring] STS 4 (Spring Tool Suite 4) 프로젝트 자바 버전 변경하기 - Windows 10

    목차 0. 설정에 들어가기 전에 - 개발할 환경의 JDK를 추가, 변경하지 않았다면 아래의 링크를 참고하세요. (JDK,JRE를 변경 및 추가했다는 가정하에 아래의 설정이 진행됩니다.) [Spring] STS 4 (Spring Too

    veneas.tistory.com

     

    Apache Commons 라이브러리 링크: http://mvnrepository.com/artifact/commons-codec/commons-codec/1.9

    프로젝트에 다운로드한 라이브러리 추가하기

     

    [Eclipse] 프로젝트에 jar 파일 추가하는 방법 (자바 라이브러리 추가)

    목차 0. jar파일 이란? - JAR(Java Archive, 자바 아카이브)는 여러 개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼

    veneas.tistory.com

     


    1. SHA 암호화 (Java)

    - java.security.MessageDigest, Apache Commons 라이브러리, java-11-openjdk-11.0.12.7-1 

    SHA + Hex(16진수), SHA + Base64

    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.binary.Hex;
    
    public class ShaClass {
    
    	public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    
    		String text = "SHA Test Text";
    		
    		System.out.println("-------------------------------------------------------");
    		
    		System.out.println("암호화 전: " + text);
    
    		System.out.println("-------------------------------------------------------");
    		
    		System.out.println("[SHA1]");
    		System.out.println("SHA1: " + shaAndHex(text, "SHA1"));
    		
    		System.out.println("[SHA2]");
    		System.out.println("SHA-224: " + shaAndHex(text, "SHA-224"));
    		System.out.println("SHA-256: " + shaAndHex(text, "SHA-256"));
    		System.out.println("SHA-384: " + shaAndHex(text, "SHA-384"));
    		System.out.println("SHA-512: " + shaAndHex(text, "SHA-512"));
    
    		//자바 9 이후 버전 부터는 기본적으로 SHA-3가 추가 되었습니다.
    		System.out.println("[SHA3]");
    		System.out.println("SHA3-224: " + shaAndHex(text, "SHA3-224"));
    		System.out.println("SHA3-256: " + shaAndHex(text, "SHA3-256"));
    		System.out.println("SHA3-384: " + shaAndHex(text, "SHA3-384"));
    		System.out.println("SHA3-512: " + shaAndHex(text, "SHA3-512"));
    		
    		System.out.println("-------------------------------------------------------");
    
    		System.out.println("[SHA1]");
    		System.out.println("SHA1: " + shaAndBase64(text, "SHA1"));
    		
    		System.out.println("[SHA2]");
    		System.out.println("SHA-224: " + shaAndBase64(text, "SHA-224"));
    		System.out.println("SHA-256: " + shaAndBase64(text, "SHA-256"));
    		System.out.println("SHA-384: " + shaAndBase64(text, "SHA-384"));
    		System.out.println("SHA-512: " + shaAndBase64(text, "SHA-512"));
    
    		//자바 9 이후 버전 부터는 기본적으로 SHA-3가 추가되었습니다.
    		System.out.println("[SHA3]");
    		System.out.println("SHA3-224: " + shaAndBase64(text, "SHA3-224"));
    		System.out.println("SHA3-256: " + shaAndBase64(text, "SHA3-256"));
    		System.out.println("SHA3-384: " + shaAndBase64(text, "SHA3-384"));
    		System.out.println("SHA3-512: " + shaAndBase64(text, "SHA3-512"));
    		
    		System.out.println("-------------------------------------------------------");
    	}
    
    	//MD5 암호화와 Hex(16진수) 인코딩
    	public static String shaAndHex(String plainText, String Algorithms) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    	    
    		//MessageDigest 인스턴스 생성(MD5)
    		MessageDigest md = MessageDigest.getInstance(Algorithms);
    	    
    		//해쉬값 업데이트
    		md.update(plainText.getBytes("utf-8"));
    	   
    		//Byte To Hex
    		return Hex.encodeHexString(md.digest());
    	}
    	
    	//MD5 암호화와 Base64 인코딩
    	public static String shaAndBase64(String plainText, String Algorithms) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    		
    		//MessageDigest 인스턴스 생성(MD5)
    		MessageDigest md = MessageDigest.getInstance(Algorithms);
    		
    		//해쉬값 업데이트
    		md.update(plainText.getBytes("utf-8"));
    		
    		//Byte To Base64 String
    		return Base64.encodeBase64String(md.digest());
    	}
    	
    }

     

    결과 값

    더보기

    -------------------------------------------------------
    암호화 전: SHA Test Text
    -------------------------------------------------------
    [SHA1]
    SHA1: e49ffcad195d72ff143d0aa1108025bd34c98464
    [SHA2]
    SHA-224: 6b4d5642a6bbf2c22d8b7ce71192b84b5893397558a7b53d994cadbd
    SHA-256: 1a45bf5c6888dcf187c693103d9c1eb91fc1085cae3636b09986bb1e8f3e7293
    SHA-384: 17304b6f9e644bbf41d9e2f1eaa50f89a96835001b34931a6a8c9edec037207fed153589fc218615eafa5755030b85d5
    SHA-512: 27915dd0c6698d383a96038125f973cbab6547aed1660c6ef9781d36224f1e2bed236008a06d88058237a6ce487fb4ac73ae2ae979de656b8508b80c6b70f0c9
    [SHA3]
    SHA3-224: 66743d000ad7d220b9d41d05fbac9c78e5a8ec1ddb77b8342aec7dce
    SHA3-256: 9964aaaea9fc03734686a41079f22dc459f056725527312b89fbd87b1512b82e
    SHA3-384: 074f83bec5770b0141e91b0c54d1f9bad0cd5bc75f0e315719204048fe056214e3f04d8b45c01c1dd20a8843cf6ec846
    SHA3-512: 341d1f2ea20e152148b8161236401f8a230c867cbed2e70a65710a7d31651f83b9eca45888fbf6c3f2e6445cc7fc8c4bb64362ae3f1ba1b91d1d48a05a4ac03b
    -------------------------------------------------------
    [SHA1]
    SHA1: 5J/8rRldcv8UPQqhEIAlvTTJhGQ=
    [SHA2]
    SHA-224: a01WQqa78sIti3znEZK4S1iTOXVYp7U9mUytvQ==
    SHA-256: GkW/XGiI3PGHxpMQPZweuR/BCFyuNjawmYa7Ho8+cpM=
    SHA-384: FzBLb55kS79B2eLx6qUPialoNQAbNJMaaoye3sA3IH/tFTWJ/CGGFer6V1UDC4XV
    SHA-512: J5Fd0MZpjTg6lgOBJflzy6tlR67RZgxu+XgdNiJPHivtI2AIoG2IBYI3ps5If7Ssc64q6XneZWuFCLgMa3DwyQ==
    [SHA3]
    SHA3-224: ZnQ9AArX0iC51B0F+6yceOWo7B3bd7g0Kux9zg==
    SHA3-256: mWSqrqn8A3NGhqQQefItxFnwVnJVJzErifvYexUSuC4=
    SHA3-384: B0+DvsV3CwFB6RsMVNH5utDNW8dfDjFXGSBASP4FYhTj8E2LRcAcHdIKiEPPbshG
    SHA3-512: NB0fLqIOFSFIuBYSNkAfiiMMhny+0ucKZXEKfTFlH4O57KRYiPv2w/LmRFzH/IxLtkNirj8bobkdHUigWkrAOw==
    -------------------------------------------------------