Java

SHA-2 256, 512 해싱 하기

RyanGomdoriPooh 2019. 9. 6. 21:38

간략하게 SHA-2 란?

SHA-2(Secure Hash Algorithm 2)는 해시 알고리즘입니다.

여기서 해시 알고리즘은 값를 입력받아, 고정된 길이의 해시값을 출력하는 알고리즘입니다.

암호 알고리즘에는 키가 사용되지만, 해시 알고리즘 함수는 키를 사용하지 않습니다. 그래서 같은 입력에 대해 항상 같은 출력이 나오게 됩니다.

해시 알고리즘 함수를 사용하는 이유는 동일한 값인지 살피거나, 변조를 탐지할 수 있는 무결성을 갖기 위함입니다.

해시함수가 출력하는 압축된 문장을 다이제스트(Digest) 라고 합니다.

SHA-2가 생성하는 Digest 출력 길이는 224, 256, 384, 512bit입니다.

SHA-2의 256bit 버전을 SHA-256로, SHA-2의 512bit 버전을 SHA-512로 줄여 부릅니다.

현재 SHA-256은 "Collision attack" 공격에 41~64 라운드(Round)를 통과하면 공격에 안전한 것으로 간주하고,
SHA-512는 46~80 라운드를 통과해야 공격으로부터 안전한 것으로 판단합니다.

Java에서 SHA2 256 또는 SHA 512 암호화를 해야하는 경우가 생깁니다.

 

여기서는 코드 상에서 어떻게 활용할 수 있는지를 설명드리겠습니다.


SHA2 256 암호화

: 주석으로 설명합니다. 하나씩 따라가면 금방 이해될 것으로 생각합니다.

// 해싱에 사용할 값
String mixPassword = hexSaltTime + password;

// 해싱을 하기 위해서는 MessageDigest Class를 사용합니다.
// MessageDigest Algorithm은 MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512 을 사용가능합니다.
// 여기서는 SHA-256 Algorithm을 사용합니다.
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");

// 값을 해싱하기 전에 reset을 통해서 해싱 인스턴스를 초기화합니다.
messageDigest.reset();

// utf8 character set으로 해싱에 사용할 값을 바이트코드로 변환하여 해싱 인스턴스에 업데이트합니다.
messageDigest.update(mixPassword.getBytes("utf8"));

// 위 과정에서 셋팅된 값을 최종적으로 digest() 함수를 통해서 해싱값을 생성합니다.
// 그리고 %064x에서 x는 16진수이고, 총 64자리의 16진수에서 값이 들어가지 못한 자리는 0으로 채워지게 됩니다.
// 최종적으로 SHA-256 해싱된 값이 16진수로 64바이트로 나오게됩니다.
// enPassword가 최종적으로 나온 해싱 결과값입니다.
String enPassword = String.format("%064x", new BigInteger(1, messageDigest.digest()));

SHA2 512 암호화

: SHA2 256에서 설명한 내용과 Algorithm 선택과 표현될 자리수만 다릅니다.

String mixPassword = hexSaltTime + password;
MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
messageDigest.reset();
messageDigest.update(mixPassword.getBytes("utf8"));
String enPassword = String.format("%0128x", new BigInteger(1, messageDigest.digest()));