ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Salt(솔트)란?
    Develop/Web & Framework 2022. 2. 6. 23:49

     

    비밀 key를 평문으로 저장하는 플랫폼이 있을까? 없을것이다.

    우리는 평문 데이터에 해시 기법을 적용하여 변환된 암호화된 데이터(digest라 부른다)를 사용한다.
    해싱 기법은 단방향으로 적용되기 때문에, 복호화가 불가하다.

    즉, 서비스에서 사용자의 비밀번호를 암호화하여 DB에 저장한 뒤에는, 관리자조차 raw한 비밀번호를 알 수 없다는 말이 된다!

    이렇게 암호화된 데이터를 DB에 저장하면, 무결성이 보장된다는 것이 이론적인 개념이지만... 현실은 그렇지 않다.
    복호화가 불가능한 것 뿐, 동일한 문자열에 특정 해싱 알고리즘을 적용하면, 그 digest는 항상 같은 값을 가지게 되지 않겠는가?
    즉, 복잡하지 않은 문자열이나 사용자들이 자주 사용하는 문자열의 경우, 손쉽게 해싱을 무력화시킬 수 있는 것이다.
    실제로 해시함수를 적용하여 생성된 값들을 저장해 둔 digest 테이블이 존재한다. 

     

    해시 함수(sha-1, sha-2) 등을 사용하여 만들어낼 수 있는 값들을 저장한 rainbow table

     


    이를 보완하기 위해 고안된 방법으로 salt(솔트) 가 있다.

    salt란, 임의의 문자열(최소 32bit 이상으로 생성하는 것이 안전하다)을 말한다.
    원문의 앞이나 뒤, 중간에 임의의 문자열을 덧붙여 해싱을 수행하는 개념이다.
    해싱을 수행할 때마다, 임의의 문자열을 생성하여 덧붙여 해싱을 적용함으로서 rainbow table에서 원문 문자열을 쉽게 알아내지 못하도록 하는 것.

    salt를 적용하지 않은 기본 단방향 해시
    salt를 적용한 hashing

     

    PBKDF2(Password-Based Key Driven Function)라는 hash container 알고리즘을 사용하면,
    salt값과 해시 함수를 적용할 iteration 수, digest의 길이를 지정하여 암호화를 수행할 수 있다.


    암호화/인증을 파이선 코드로 구현한 예시이다.

    pbkdf2를 적용한 암호화

    저장한 salt값과 입력받은 raw 문자열에 다시 pbkdf2 알고리즘을 적용, 새로운 key를 생성하고
    이 key값이 우리가 가지고 있는 사용자의 key값과 일치하는지 확인하는 방식으로 인증을 수행하게 된다.

    암호화된 key와 사용자의 key를 비교하여 인증을 수행

    댓글

Designed by Tistory.