encrypt와 hash의 차이 – 패쓰워드 저장에 있어서

encrypt는 암호로 바꾼다는 뜻의 동사다. 반대말로 decrypt 암호를 푼다는 동사가 있다. encrypt는 decrypt를 전제로 한다. 정보를 암호로 만들기만 해 놓으면 쓸모가 없다.

hash는 엉망으로 만든다는 의미의 동사다. 프로그래밍에서 해쉬는 encrypt와 비슷하다. 정보를 그 자체로는 아무 의미가 없는 무언가로 바꾸어 놓는다. 하지만 encrypt와의 차이라면 해쉬된 결과물은 원래의 정보로 돌려 놓을 수가 없다는 거다.

예를 들어 네트워크에서 정보를 보낼 때 중간에서 누군가가 가로채서 볼 수 있다. 이걸 막기 위해 암호화하여 보내고 받은 쪽에서는 복호화하여 그 내용을 확인한다. 이와는 다른 경우로 여러 이용자들의 계정 정보를 가지고 있는 써버는 써버가 털릴 때를 대비하여 계정의 패쓰워드를 문자열 그대로 저장하지 않는다. 그렇다고 암호화를 할 필요는 없다. 복호화해야 할 경우가 없기 때문이다. 그저 원래의 모습만 지워서 누가 봐도 그 의미를 모르게 하면 그만이다. 계정의 주인이 써버에 접속하기 위해 자신의 암호를 해쉬하여 써버로 보내면 써버는 이걸 받아서 자신이 저장하고 있는 해쉬된 결과와 같은가만 대조하면 된다. 따라서 패쓰워드를 저장할 때에는 암호화하지 않고 해쉬화한다.

해쉬된 대이터가 네트워크에서 이동할 때 이걸 가로채면 이거로 로그인을 시도할 수도 있다. 하지만 이런 경우를 막기 위한 방법들이 있으며 해쉬는 본질적으로 네트워크에서의 보안을 목적으로 하는 게 아니라 대이터배이쓰가 뚫릴 때를 대비하는 거다. 여러 써버에 같은 패쓰워드를 이용하는 경우들이 흔하다. 패쓰워드를 해쉬해 놓으면 이게 해킹되어도 다른 써버를 이용하는 같은 사용자의 계정 접속에 이용할 수가 없다.