목차
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이라고 말할 정도로 상용화가 잘 되어있습니다.
0.2. 준비하기
- 암호화에 Java 기본 라이브러리(java.security.MessageDigest)를 사용합니다.
- JDK 9 이상을 사용하셔야 SHA-3 암호 알고리즘을 사용할 수 있습니다.
(필자는 java-11-openjdk-11.0.12.7-1.windows.ojdkbuild.x86_64를 이용했습니다.)
- 암호화 한 값을 출력(인코딩)을 위해 Apache Commons 라이브러리를 사용합니다(다운로드 필요!).
프로젝트 자바 추가, 변경 및 적용을 모를 경우 아래의 링크를 참조해주세요.
Apache Commons 라이브러리 링크: http://mvnrepository.com/artifact/commons-codec/commons-codec/1.9
프로젝트에 다운로드한 라이브러리 추가하기
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==
-------------------------------------------------------
'Backend > Java' 카테고리의 다른 글
[JAVA] 자바 AES 암호화 하기 (AES-128, AES-192, AES-256) (0) | 2021.08.28 |
---|---|
[JAVA] 자바 Hmac 암호화 하기 (HMAC-MD5, HMAC-SHA256, HMAC-SHA512) (2) | 2021.08.16 |
[JAVA] 자바 MD5 암호화 (단방향 암호화) (0) | 2021.08.14 |
[JAVA] Hex 인코딩 디코딩 방법 (16 진수) (0) | 2021.08.13 |
[JAVA] Base64 인코딩, 디코딩 3가지 방법 (0) | 2021.08.10 |