IT 공부/이슈

[공부] 패스워드에 salt 적용, 이유를 찾으면서

빈카(Vinca) 2021. 11. 14. 19:58

필자는 Why충

Why?

비밀번호 해킹에는 다양한 종류가 있다.

  1. 대입 공격 : 복잡한 비밀번호를 작성하는 방법밖에 없다 / (패스워드 찾는 데 시간 소요가 많이 들게 함) 
    • 무작위 대입 공격
    • 사전 대입 공격
    • 혼합 공격
  2. DB 탈취
    • Sql injection : 서버 보안, 권한, 로직이 필요하다...
  3. 해쉬 이용
    • 충돌 공격 : 해쉬 알고리즘 SHA-2 이상부터는 충돌 가능성이 낮다
    • 레인보우 테이블 : Salt 적용 
  4. 패킷 이용
    • 스니핑 : SSL, SSH등의 암호화 프로토콜 사용하여 예방
    • SSL sniffing, SSL strip : 사이트가 HTTPS로만 들어갈 수 있게 해야 함
    • 더보기
      (비밀번호 해킹 x)
      • 스푸핑
      • 서비스 거부(Denial of Service) <- DDoS(Distributed Denial of Service)의 기반

** 2, 4는 단순히 비밀번호 해킹에 국한되어 있지 않다.

 

 레인보우 테이블 

해시함수(MD-5, SHA-1, SHA-2 등)를 사용하여 만들어낼 수 있는 값들을 대량으로 저장한 표이다. 
보통 해시함수를 이용하여 저장된 비밀번호로부터 원래의 비밀번호를 추출해 내는 데 사용된다.

  1. 대입 공격 시 더 빠르게 비밀번호를 시도해 보기 위해
  2. 해쉬에서 평문을 추출해내기 위해

레인보우 테이블 사용 선행 과정으로는 DB와 같은 자료에서 해쉬값을 뽑아내야 한다.
(sql injection이나 패킷에 해쉬값이 저장되어 있다면 스누핑 등등)
해쉬값을 알게 되었을 때 비밀번호를 찾는 시간이 줄어들게 된다.

그래서

salt값을 적용해서 해쉬값을 만든다. (Salt는 임의의 난수)

1. password에 소금을 쳐서 = password + salt를 해쉬 하여 DB에 저장한다.

 

password salt sha256(password + salt)
1234 a3d1483329** c62d929e7b7e7b6165923a5dfc60cb56
1234 b264f65470** 297cb436996a984e46bfc94ef53955a1

위 값은 예시를 위해 아무렇게나 집어넣었기에 실제 값과는 다를 수 있습니다.

하지만 동일한 패스워드를 넣어도 다른 결과가 나오는 것이 중요함!

 

How?

적용 방법은 블로그나 가이드라인에 잘 설명되어 있기에 링크를 남기겠다. 
나중에 필자가 다시 찾아보기 편하도록....
개인적으로 궁금한 부분만 찾아서 취합은 페이지이다!

https://st-lab.tistory.com/100 : 패스워드의 암호화와 저장 - Hash(해시)와 Salt

 

Salt를 적용할 때 유의점

(여기 정말 좋은 페이지인데 글이 너무 많다) https://starplatina.tistory.com/m/entry/비밀번호-해시에-소금치기-바르게-쓰기

1. salt값은 난수 생성기에 의해 생성해야 한다.

출처 : https://starplatina.tistory.com/m/entry/비밀번호-해시에-소금치기-바르게-쓰기

 

2. 항상 서버에서 해시 및 솔트 적용을 해야 한다.

클라이언트에서 해쉬를 할 경우, 
해커가 해쉬값을 알아냈을 때 굳이 암호를 해석하지 않고 값을 그대로 서버에 전송하면 되기 때문에 위험!
클라이언트에서도 해쉬를 해야 한다면 서버에서도 해야 한다.(이중 해쉬)

그러면 평문 혹은 바이트 값으로 비밀번호를 서버에 전송할 텐데.. 갈취(스누핑) 위험이 있지 않을까?라는 생각을 했다.
아니나 다를까
HTTPS(SSL / TLS) 같은 암호화 기법을 이용해야 한다.

(그럼...SSL사용 이전에는 어땠을 까?) - https://webhack.dynu.net/?idx=20161116.002&print=friendly

 

 

+ DB에 저장할 때

. ver1

key colums salt적용 hash값 salt
ID1 ... c62d929e7b7e7b6165923a5 a3d1483329**
ID2 297cb436996a984e46bfc94e b264f65470**

아마도 이런 식으로 들어갈 것이다.

salt와 해쉬값까지 해커가 가져갔다면 그냥 해쉬 함수랑 크게 다를 것이 없을지도 모른다. 
그래도 salt + password / password + salt 등의 여러 가지 방법으로 salt를 적용했을 수도 있기에 찾는 데 시간은 오래 걸릴 것이다.

 

. ver2

저장할 때 salt값을 따로 저장하는 것이 아니라

salt + hash( password + salt)로 저장하면 어떨까? 했더니 역시 똑똑한 사람들은 이 방법을 생각해 냈다.
(salt값의 길이는 고정)

변칙적인 방법을 가미한 해쉬라고 한다.

key colums salt+(salt적용)hash
ID1 ... a3d1483329**c62d929e7b7e7b6165923a5
ID2 b264f65470**297cb436996a984e46bfc94e

 

 

더보기

 

부족하거나 틀린 부분이 있다면 알려주세요! (그것도 공부!)