본문 바로가기
카테고리 없음

소금값과 함께 안전한 비밀번호 해싱

by 공.대.남 2023. 8. 11.
반응형

 

안녕하세요! 공대남입니다!

오늘은 기본적으로 비밀번호 해싱에 대해 알아볼게요

기본적으로 저희는 비밀번호에 대해 sha 256, sha512 등의 안전한 해시 함수를 이용해 암호화하여 db에 저장하게 됩니다.

하지만 

기본 : 소금값과 함께 해싱하기
 

 

이전 섹션에서 악의적인 목적을 가진 해커가 룩업 테이블과 레인보우 테이블을 사용해서 일반 해시를 해킹하는것을 살펴보았다. 이 문제를 해결하는 방안으로 소금값을 랜덤으로 생성하여 해싱할 때 같이 사용하는것을 배웠지만 소금값을 어떻게 생성하고 비밀번호에 이를 어떻게 적용할 것인가?
 
소금 값은 암호학적으로 안전한 난수 생성기에 의해 생성(Cryptographically Secure Pseudo-Random Number Generator, CSPRNG)되어야 한다. CSPRNG은 C언어의 rand() 함수처럼  일반 난수생성기와 매우 다르다. 이름을 통해 짐작하듯이 CSPRNG는 암호화를 사용하도록 설게되어 있고 이 것은 완벽히 예측 불가능 한것을 의미한다. 소금값은 예측가능한 것을 사용할수 없기 때문에 반드시 CSPRNG를 사용해야 된다. 아래 표에서는 유명한 프로그래밍 언어에서 제공하는 CSPRNG 목록이다.
 
PlatformCSPRNG
PHP mcrypt_create_iv, openssl_random_pseudo_bytes
Java java.security.SecureRandom
Dot NET (C#, VB) System.Security.Cryptography.RNGCryptoServiceProvider
Ruby SecureRandom
Python os.urandom
Perl Math::Random::Secure
C/C++ (Windows API) CryptGenRandom
Any language on GNU/Linux or Unix Read from /dev/random or /dev/urandom
 
소금값은 사용자와 비밀번호 별로 유일한 값을 가져야 한다. 사용자 계정을 생성할때와 비밀번호를 변경할때마다 새로운 임의의 랜덤 소금값을 사용해서 해싱 해야 된다. 소금값은 절때 재사용 하지 말아야 되고 길게 만들어야 되기 때문에 다양한 값을 생성할 수 있다. 소금값은 해쉬 함수의 출력 값 만큼 길게 만들고 사용자 계정 테이블에 같이 저장되도록 한다.
 
비밀번호 저장하기
1. CSPRNG를 사용해서 임의의 소금값을 생성한다.
2. 소금값을 비밀번호 앞에 덧붙이고 SHA256 같은 표준 암호화 해시 함수를 사용해서 해시한다.
3. 소금값과 해시값을 사용자 계정 테이블에 저장한다.
 
비밀번호 유효성 검사
1. 사용자의 소금값과 비밀번호 해시값을 데이터베이스에서 찾는다.
2. 입력한 비밀번호에 소금값을 덧붙이고 비밀번호 해싱에 사용했던 동일한 해싱함수를 사용하여 해싱한다.
3. 입력한 비밀번호로 생성한 해싱값과 저장되어 있는 해싱값과 비교해서 일치하는지 확인하고 동일 하면 비밀번호가 정확한 비밀번호를 입력한것이고 아니면 잘못된 비밀번호를 입력한 것이다.

 

728x90
반응형

댓글