# RSA-256는 단방향 암호화 알고리즘
해싱을 통해 암호화를 진행한다.
여기서 해싱은 임의의 길이의 데이터를 고정된 길이의 값으로 바꾸는 과정 즉, 매핑하는 과정을 '해싱'이라 하며 해싱된 결과는 해싱값이라고 부른다.
해싱된 값은 복호화가 거의 불가능에 가깝지만, 여기서 고려해야 할 점은 `동일한 메시지는 동일한 다이제스트`를 갖는다는 점이다.
만약 여러분이 해커라고 가정해볼 때 해싱된 메시지의 원문을 얻기 위해서 가장 편한 방법은 무엇일까?
그것은 바로 그동안 해커들이 여러 값들을 대입해보며 얻었던 다이제스트들을 모아놓은 리스트에서 찾아보는 것이다. 이러한 다이제스트들의 테이블을 우리는 레인보우 테이블(Rainbow Table) 이라고 한다.
사용자가 123456 이라는 비밀번호를 사용했다고 가정해보자. 그럼 RSA-256 알고리즘을 통해 이 값은 해싱되어
`8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92` 이러한 값이 나올 것이다.
만약 해커이 위 비밀번호를 찾았다고 가정해보자.
아직까지는 위의 값을 통해서 실제 비밀번호를 유추할 수는 없다.
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack
crackstation.net
하지만 위와 같이 간단한 비밀번호라면 레인보우 테이블에 저장될 가능성이 높다.
RSA-256에 저장된 레인보우 테이블에 위 암호화된 값을 추가하면 result로 123456이 나온다.
아래와 같이 복잡하지 않은 password인 경우 이미 공격자가 대입해봤을 확률이 높다. 그러니 레인보우 테이블에 있을 가능성이 있어 비밀번호가 유출될 수 있다.
## SALT 를 추가해서 해싱
위와 같이 RSA-256을 통해 해싱을 한 결과물은 모두가 같기 때문에, 레인보우 테이블에 해당하는 값이 존재한다면 역으로 데이터를 찾을 수 있다는 점이다. 이를 해결하기 위해서 salt를 추가해서 암호화를 진행한다.

그래서 필자는 hashing을 할 때 salt 값을 추가하여 해싱을 추가적으로 진행하여 rainbow table에 존재할 수 없는 암호화된 값을 추가한다.
여기서 salt는 기존의 비밀번호가 123456에 추가하는 것이다.
만약 salt 가 abc2 라면 123456abc2를 RSA-256으로 해싱을 하는 것이다.
추가적으로 반복해서 해싱을 하여 좀 더 안전한 단방향 암호화를 진행하였다.
하지만 여기서 해싱을 높이면 서버의 리소스가 부하되기 때문에 적절한 개수를 정해야 한다. (여기서 적절한 해싱 개수는 공인 기술문서에 있다고 한다..)
## HMAC-SHA256
추가적으로 비밀 키와 메시지를 결합하여 SHA-256을 통해 해시값을 생성하기도 한다.
이렇게 해도 비밀키가 추가되었기 때문에 레인보우 테이블에 존재하지 않아 좀 더 안정적인 암호화가 될 것이다.
# 출처
'BACKEND > Spring' 카테고리의 다른 글
[Spring boot] Service class에 @Transactional(readOnly = true)를 붙인 이유 (0) | 2024.08.10 |
---|---|
[Spring boot] 초기 데이터 설정 (0) | 2024.08.08 |
[Spring boot] 비관락, 낙관락, 분산락 구현 (0) | 2024.08.08 |
[Spring] 스프링 AOP란? (0) | 2024.05.29 |
[Spring Boot] 캐싱 모니터링 k6 + InfluxDB + Grafana (0) | 2024.05.28 |