해싱은 암호 및 기타 중요한 데이터를 암호화하는 데 사용되는 기술입니다. 해싱은 입력을 받아 고정된 크기의 문자열을 생성하는 단방향 함수입니다. 이 출력을 해시라고 합니다. 해시는 그것을 생성한 입력에 대해 고유합니다. 즉, 입력에 약간의 변화가 있어도 완전히 다른 해시가 생성됩니다.
해싱은 해시 함수(Hash Function)을 사용하여 암호화를 진행하는데, 해시 함수는 다음과 같은 특징을 가집니다.
항상 같은 길이의 문자열을 리턴합니다.
서로 다른 문자열에 동일한 해시 함수를 사용하면 반드시 다른 결과값이 나옵니다.
동일한 문자열에 동일한 해시 함수를 사용하면 항상 같은 결과값이 나옵니다.
비밀번호
해시 함수(SHA1) 리턴 값
‘password’
‘5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8’
‘Password’
‘8BE3C943B1609FFFBFC51AAD666D0A04ADF83C9D’
‘kimcoding’
‘61D17C8312E8BC24D126BE182BC674704F954C5A’
사용자가 웹사이트에서 계정을 생성하면 비밀번호가 해시되어 웹사이트 데이터베이스에 저장됩니다. 사용자가 로그인하면 웹사이트는 사용자가 입력한 암호를 해시하고 저장된 해시와 비교합니다. 두 해시가 일치하면 사용자에게 계정에 대한 액세스 권한이 부여됩니다.
해싱은 누군가가 웹 사이트의 데이터베이스에 액세스하더라도 암호를 읽을 수 없기 때문에 암호를 저장하는 안전한 방법입니다. 대신 해시만 볼 수 있습니다. 즉, 해시가 도난당하더라도 도둑은 원래 암호를 알아내기 위해 시간이 많이 걸리는 무차별 대입 공격을 수행해야 합니다.
대칭 및 비대칭 암호화와 같은 다른 암호화 방법과 달리 해싱은 해독할 수 없습니다. 이는 해시가 원래 데이터를 포함하지 않고 데이터의 고정 크기 표현을 포함하기 때문입니다. 원본 데이터는 해시에서 파생될 수 없습니다.
해싱은 일반적으로 암호를 안전한 방식으로 저장하는 데 사용됩니다. 사용자가 웹사이트에서 계정을 생성하면 비밀번호가 해시되어 웹사이트 데이터베이스에 저장됩니다. 사용자가 로그인하면 웹사이트는 사용자가 입력한 암호를 해시하고 저장된 해시와 비교합니다. 두 해시가 일치하면 사용자에게 계정에 대한 액세스 권한이 부여됩니다.
해싱(Hansing)의 문제점
항상 같은 결과값이 나온다는 특성을 이용해 해시 함수를 거치기 이전의 값을 알아낼 수 있도록 기록해놓은 표인 레인보우 테이블이 존재합니다. 레인보우 테이블에 기록된 값의 경우에는 유출이 되었을 때 해싱을 했더라도 해싱 이전의 값을 알아낼 수 있으므로 보안상 위협이 될 수 있습니다.
레인보우 테이블에 값이 기록되어 있다면 해싱을 해도 원래 값을 쉽게 알아낼 수 있기 때문에 보안상 위협이 됩니다.
레인보우 테이블은 미리 계산된 해시 테이블과 해당 입력 값입니다. 공격자는 테이블에서 해시를 조회하여 해시를 생성한 입력 값을 확인할 수 있습니다.
레인보우 테이블에 값이 기록되어 있으면 공격자는 해시를 생성한 입력 값을 쉽게 확인할 수 있으므로 해시 전 원래 값을 알 수 있습니다. 이는 값이 유출될 때 해싱되더라도 공격자가 여전히 원래 값을 확인할 수 있음을 의미합니다.
이 위협을 완화하려면 강력하고 고유한 암호를 사용하고 암호를 해싱할 때 솔트를 사용하는 것이 중요합니다. 솔트는 소금이라는 뜻으로, 말 그대로 소금을 치듯 해싱 이전 값에 임의의 값을 더해 데이터가 유출 되더라도 해싱 이전의 값을 알아내기 더욱 어렵게 만드는 방법입니다. 이로 인해 공격자가 레인보우 테이블과 같은 미리 계산된 테이블을 사용하여 원래 값을 결정하기가 더 어려워집니다.
비밀번호 + 솔트
해시 함수(SHA1) 리턴 값
‘password’ + ‘salt’
‘C88E9C67041A74E0357BEFDFF93F87DDE0904214’
‘Password’ + ‘salt’
‘38A8FDE622C0CF723934BA7138A72BEACCFC69D4’
‘kimcoding’ + ‘salt’
‘8607976121653D418DDA5F6379EB0324CA8618E6’
결론적으로 레인보우 테이블에 값이 기록되어 있다면 해싱을 해도 원래 값을 쉽게 알아낼 수 있기 때문에 보안상 위협이 된다. 이 위협을 완화하려면 강력하고 고유한 암호를 사용하고 암호를 해싱할 때 솔트를 사용하는 것이 중요합니다.