본문 바로가기

BackEnd/Java&Spring

Java의 Hash 알고리즘 MessageDigest

요즘 핫한 보안 문제 ❗

이번에 신규 개발하는 기능에도 보안을 위해 사용자의 정보가 담긴 내용은 암호화를 하기로 했답니다.

Java에서 Hash 값 생성을 할 때 많이 쓰는 클래스는 MessageDigest인데, 오늘은 이 친구를 정리해보겠습니다.

 

 

🔐MessageDigest

 

https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html

 

MessageDigest (Java Platform SE 7 )

This MessageDigest class provides applications the functionality of a message digest algorithm, such as SHA-1 or SHA-256. Message digests are secure one-way hash functions that take arbitrary-sized data and output a fixed-length hash value. A MessageDigest

docs.oracle.com

 

공식 API 문서 내용을 인용하자면~

MessageDigest는 어플리케이션에서 SHA-1이나 SHA-256 같은 digest 알고리즘으로 메시지를 만드는 기능을 제공해 줍니다.

(그래서 클래스 이름이 이랬군요)

임의 크기(arbitrary-sized)를 사용하고, one-way 해시 함수를 구현해서, 고정 길이의 해시 값을 출력해줍니다.

 

MessageDigest md = MessageDigest.getInstance("SHA-256");

선언은 위에 예시처럼 해줄 수 있는데, MessageDigest object는 초기화된 상태로 시작이 됩니다.

 

결과를 출력할 때 중요한 함수가 몇 개 있답니다.

 

🔑 getInstance("SHA-256")

 

md.getInstancd("SHA-256");

getInstance() 파라미터에 사용하고자 하는 알고리즘 이름을 적어주면, MessageDigest Object가 생성 됩니다.
만약 알고리즘 이름이 유효하지 않은 방식이라면 Exception으로 NoSuchAlgorithmException가 오기 때문에, try-catch로 처리해줍시다.
구현 가능한 알고리즘 종류는 아래 사이트에서 확인할 수 있습니다.

 

https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest

 

Standard Algorithm Name Documentation

SSL3Padding The padding scheme defined in the SSL Protocol Version 3.0, November 18, 1996, section 5.2.3.2 (CBC block cipher): block-ciphered struct { opaque content[SSLCompressed.length]; opaque MAC[CipherSpec.hash_size]; uint8 padding[ GenericBlockCipher

docs.oracle.com

 

🔑 update()

 

md.update(("암호화할 문자열").getBytes())

update()를 사용해서 해시를 생성하고자하는 문자열을 MessageDigest에 update 해줍니다.
update()를 호출할 때마다 MessageDigest object에 저장된 digest 값이 갱신이 됩니다
(reset() 함수를 호출해서 초기화 해줄 수도 있음)

 

🔑 digest()

 

byte[] hashValue = md.digest();

update된 데이터를 해시 값으로 완성해줍니다. 결과 값은 toString()으로 받을 수도 있답니다.

'BackEnd > Java&Spring' 카테고리의 다른 글

🌸 startsWith()/endWith() 문자열의 시작과 끝  (0) 2023.04.04
@JsonProperty와 @JsonNaming  (0) 2023.03.17
HTTP Query Parameter에서 Arrary List 사용  (0) 2023.02.01
Spring Cron Expression  (0) 2023.01.25
StringUtils  (0) 2023.01.18