본문 바로가기
Security

패스워드 암호화/인증(해싱) 과정 & 중간 패킷 탈취에 대한 오해

by ahsung 2021. 4. 29.

 

사전 참고: https://asung123456.tistory.com/55

 

[컴퓨터 보안] 해싱과 암호화

해싱이란? input으로 들어온 값이 해싱 함수를 거쳐 일정한 길이의 output으로 나오게 됩니다. 일정한 길이의 output이기 때문에 해싱의 종류에 따라 output으로 나오는 경우의 수는 한정됩니다. 통상

asung123456.tistory.com

 

패스워드 암호화

보통 패스워드는 암호화되어 다뤄지기 때문에 Client에서 암호화(혹은 해싱)되고(https 포함)하여 전송한다.

 

 

패스워드 인증

서버에서는 패스워드를 평문으로 다루지 않기 때문에 해싱된 패스워드를 DB에 저장하게된다. (salt를 섞기도하고)

 

중간 패킷 탈취에 대한 오해 

일반적인 패스워드의 경우 Https와 같은 프로토콜을 통한 암호화 통신과 DB 저장시 해싱을 사용하는게 일반적이다.

이때 착각했던 오류는 암호화와 해싱을 모두 client에서 하고 Server는 오로지 (https에 대한)복호화만 한다고 이해했다.

 

첫 번째

이런 오류대로면, 서버 입장에서 어차피 패킷은 항상 이미 암호화+ 해싱되어 있으니

굳이 클라이언트단에서 원본 패스워드를 탈취할 필요 없이 네트워크에서 패킷을 탈취하고 

암호화+해싱된 값을 그대로 보내면 어차피 서버 입장에서는 클라이언트에서 제대로 받은 것과 차이가 없어 인증에 성공할 수도 있을 수도 있다고 생각했다.

 

두번째

만약 첫 번째 착각을 매번 로그인 할때 암호화하는 key를 다르게 한다면 탈취한 패킷을 그대로 사용하는 것은 막을 수 있지만

서버의 DB에 있는 해싱된 패스워드를 저장해도 일반 패스워드를 저장한 것과 보안상 차이가 없지 않나? 착각이 들었다.

이유는 보통의 웹클라이언트쪽은 public key를 사용기 때문에 어차피 크래커가 key를 알기 쉽기 때문에 굳이 원본 패스워드를 모르더라도

해싱된 패스워드를 그대로 public key로 암호화해서 보내면 어차피 똑같은게 아닌가? 생각했다.

(SSL은 대칭, 비대칭을 섞어서 사용하므로 실제 패스워드는 대칭키로 암호화함 / 대칭키에 사용하는 임시키를 비대칭으로 보통 교환함)

(public key / private key는 그래서 인정서의 만료기간만큼만 유효하게 운영함 -> private key 탈취당하면 인증서 교체해야함)

 

결론

착각한 부분은 서버가 절대 원본 패스워드를 단 한순간도 들고 있지 않다는 가정 오류이었다.

결과부터 얘기하면, 해싱된 패스워드를 생성하는 것은 클라이언트가 아닌 "서버"였다.

클라이언트는 원본 패스워드를 암호화만 한체 서버측으로 패스워드를 보낸다.

즉 서버도 패킷을 복호화하는 순간에는 메모리에 원본 패스워드를 갖고 있을 수 있다.

(물론 없게 할 수도 있다 , 방법은 아래에)

그리고 인증을 하기 위해서는 다시 그 원본 패스워드를 해싱후 DB에 해싱해서 저장한 패스워드와 비교를한다.

 

이렇게 하게되면 DB에 있는 해싱된 패스워드가 탈취되더라도 두번째 오해처럼 public key로 다시 암호화해봤자

서버의 실제 인증과정에서는 클라이언트에서 받은 원본 패스워드를 항상 해싱하기 때문에 이미 해싱된 패스워드는 쓸곳이 없다.

물론 여기에도 서버측이 가지고 있는 private key까지 탈취하면 어떡하냐고 할 수 있다.

패킷을 탈취하고 그때 사용한 private key를 타이밍 맞게 정확하게 탈취해야되기 때문에 희박한 확률이지만

이럴 때는 이중 해싱을 사용하면된다.

즉 client에서도 패스워드를 암호화만 하는 것이 아닌, 해싱 + 암호화를 하고 서버에서는 한번 더 해싱을 해서 저장하는 것이다.

그렇게 되면 네트워크 상에서 원본 패스워드는 네트워크상에서 절대 유출되지 않으므로 원본 패스워드를 알길은 사실상 없어지고,

만에하나 탈취했던 private key로 client에서 해싱한 패스워드를 그대로 서버측에 보내어 클라이언트가 보낸 것처럼 위장할해도 매번 인증마다 Key를 다르게 쓰면 재사용 할 수 없으므로 무용지물이다.

 

이렇듯 서버에서 해싱하는 작업이 필수적이며 이중해시를 이용하면 서버의 메모리와 어떤 네트워크에서도 원본 패스워드를 단 한순간도 남기지 않을 수 있다.

 

물론 이 모든 작업을 진행하는 client 자체가 털리면 이 모든 보안과정은 의미가 없다.

client에는 직접 패스워드를 입력하기때문에 당연히 메모리에 무.조.건 남을 수 밖에 없다.

**이런 별표시로 안보이게하든 여러가지 방법을 써봤자 눈에 안보이는 거지, 컴퓨터 메모리 상에는 무조건 원본 패스워드가 남는다.

그래서 애초에 신뢰성있는 브라우저와 client를 사용해야된다. 불법 사이트를 접속하려고 이상한 브라우저를 쓰면 다 털린다.

 

웹사이트또한 마찬가지 신뢰성 없는 특히 공인된 CA가 아닌 https 혹은 https 자체가 설정이 안되있는 사이트라면 절대 평상시에 사용하던 패스워드는 사용하면 안된다.

이런 서버들은 서버측에서 원본 패스워드를 갖고 있으며 사업등록을 하지 않기 때문에 패스워드를 악용하고 팔아버릴 수 있다.

 

 

 

'Security' 카테고리의 다른 글

[컴퓨터 보안] 해싱과 암호화  (2) 2023.01.09

댓글