본문 바로가기

Java and Spring

[Java] Message Digest 암호화 방식

공부하기에 앞서 먼저 알아둘 것이 있는데, 해싱과 암호화는 어느 정도 비슷하다고 생각할 수 있으나, 암호학적으로 본다면 차이가 있습니다. 먼저, 가장 큰 차이점은 "방향성"입니다.

단방향, 즉 평문을 암호화하고 난 후 복호화가 불가능한 것이 해싱이다.

양방향, 즉 평문을 암호화하고 난 후 복호화가 가능한 것이 암호화이다.

 

단방향 해시함수

이번에 공부할 MessageDigest함수는 단방향. 즉, 해싱에 대해서 알아 보려고 합니다.

간단하게 그림으로 설명을 해보자면 다음과 같습니다.

Password를 MessageDigest함수를 사용하여 해싱은 가능하지만, 반대로 암호화된 데이터를 복호화하지는 못하는 의미입니다.

 

그렇다면, 가장 대표적인 해싱 알고리즘에는 어떤 것들이 있을까요??

대표적으로는 MD5, SHA256 등 여러 가지가 있습니다.

 

단방향 해시함수의 한계점

저렇게 SHA함수를 사용하여 DB에 저장하면 안전할 것 같지만, 사실 그렇지 않습니다.

그 이유를 알아보도록 하겠습니다!!

 

동일한 메시지는 동일한 다이제스트를 갖는다.

이 의미는 이미 많이 사용되고 있는 비밀번호들을 찾는 다이제스트들이 등록되어있다는 의미로 받아들일 수도 있습니다. google에 SHA-256 Rainbow table이라고 검색을 하면, 이미 많은 비밀번호들을 SHA-256으로 다이제스트 한 테이블이 있다는 의미입니다.

 

단방향 해시함수 보완하기

1. 해시함수 여러 번 수행하기 [키 스트레칭 - Key_Stretching]

말 그대로 SHA-256 함수를 여러 번 수행시키는 의미입니다. 반복하여 수행하는 이유는 SHA-256 함수는 "123456"을 해싱한 것과 "123457"을 해싱한 결과가 전혀 다르게 나오기 때문입니다.

즉, "6", "7"은 숫자로써는 1밖에 차이가 나지 않지만, 결과적으로는 크게 달라지기 때문입니다.

2. 솔트(Salt)

솔트란 해시함수를 돌리기 전 임의의 문자열을 붙인다는 의미입니다.

말 그대로 문자열에 소금을 친다는 의미와도 같습니다.

이 그림으로 예를 들어 설명하면, 만약 동일한 패스워드를 사용하는 사용자가 비밀번호가 유출되었다고 하더라도 사용자별로 등록되어있는 salt가 다르기 때문에 다이제스트 값은 다른 것이 됩니다.

즉, 다른 사용자는 해킹의 위협으로부터 안전하다는 의미입니다.

 

예제 코드

1. Main

2. getShaAlgorism() - MessageDigest를 사용

3. getSalt() - SecureRandom을 사용

4. 결과

'Java and Spring' 카테고리의 다른 글

CORS(Cross-Origin Resource-Sharing)란?  (0) 2023.10.21
[Spring] 커넥션 풀과 데이터소스  (0) 2022.04.19
[Spring] 스프링 AOP  (0) 2021.12.15
[Spring] 빈 후처리기  (0) 2021.12.11
[Spring] 프록시 팩토리  (0) 2021.12.08