회원가입을 하면 DB에 비밀전호가 그대로 저장
DB가 해킹 당하게 되면 해당 서비스 사이트의 이메일과 비밀번호를 가져갈 수 있음
많은 사람들이 여러 사이트에 동일한 이메일과 비밀번호를 사용하는 경우가 많음
다른 서비스까지 추가 해킹을 당하는 일이 발생
기밀성을 유지 하기 위해 DB에 비밀전호를 저장할 때는 비밀번호를 암호화(Encrypt)하여 저장
암호화를 하여 저장하면 암호화에 사용된 키(비밀번호)를 통해 데이터를 복호화 할수 있음
완전히 안전한 암호화가 아니기에 해싱이 나타나게 됨
암호화를 구성하는 요소
Hash는 단방향 암호화 기법
Encryption은 양방향 암호화 기법
양방향 암호화
단방향 암호화
단방향 해시 함수는 어떤 수학적 연산(또는 알고리즘)에 의해 원본 데이터를 매핑 시켜
완전히 다른 암호화된 데이터로 변환시키는 것을 의미
이 변환을 해시라고 하며, 해시에 의해 암호화된 데이터를 다이제스트(digest)라고 함
해싱은 단방향
단방향 해시 함수는 다이제스트를 복호화, 즉 원본 데이터로 구할 수는 없음
말 그대로 단 방향성
비밀번호를 해시 함수에 돌려서 다이제스트인 암호를 생성 후 해당 암호를 DB에 저장
저장된 다이제스트를 DB누출 된다 하여도 단방향으로 해싱 된 문자라 복호화 할수 없음
가장 대표적인 해시 알고리즘 SHA-256
키 스트레칭은 개발자가 횟수를 정해서 Hash 함수를 돌리는 방법
패스워드를 저장할 때 가장 쉽게 생각할 수 있는 방법
SHA-256 해시 함수를 사용한다 가정했을 때
123456이 입력되었다면 123456의 다이제스트는 아래와같음
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
이 다이제스트를 한 번 더 SHA-256에 돌리면 아래와 같음
49dc52e6bf2abe5ef6e2bb5b0f1ee2d765b922ae6cc8b95d39dc06c21c848f8c
솔트(Salt)란 해시 함수를 돌리기 전에 원문에 임의의 문자열을 덧 붙이는 것을 말함
의미 그대로 원문에 임의의 문자열을 붙이는 의미의 소금 친다(Salting)이라고 생각하면 됨
이렇게 하면 다이제스트를 알아낸다 하더라도 password를 알아내기 더욱 어려워짐
다른 Salt를 사용한다면 설령 같은 비밀번호더라도 사이제스트의 값은 달라짐
한 명의 패스워드가 유출되더라도 같은 비밀번호를 사용하는 다른 사용자는 비교적 안전하다는 의미