- 데이터베이스에 그대로 비밀번호를 저장했을때, 데이터베이스가 노출된다면 타인이 유저의 계정을 이용하는 최악의 상황이 발생한다. 따라서, 암호화는 필수이다.
- 정의 :
1. 평문(Plaintext) : 해독 가능한 형태의 메시지
- 암호문Cipertext) : 해독 불가능한 형태의 메시지
- 암호화(Encryption) : 평문을 암호문으로 변환하는 과정
- 복호화(Decryption) : 암호문을 평문으로 변환하는 과정
- 종류 :
1.양방향 암호화 : Encryption => 암호화와 복호화과정을 통해 송,수신간 주고받는 메시지를 안전하게 암,복호화하는 과정
- 단방향 암호화 : Hashing => 해싱(hashing)을 이용한 암호화 방식으로 양방향과는 다른 개념으로, 평문을 암호문으로 암호화는 가능하지만 암호문을 평문으로 복호화 하는 것은 불가능하다.
- 단방향 해시 함수는 어떤 수학적 연산(또는 알고리즘)에 의해 원본 데이터를 매핑시켜 완전히 다른 암호화된 데이터로 변환시키는것을 말한다. 해시에 의해 암호화된 데이터를 다이제스트(digest)라고 한다.
- 단순한 해시 함수를 이용해서 변환만 해서는 보완이 완벽하다고 할 수 없다. 이점을 보완하기 위해 생겨난 것이 키-스트레칭과 솔트(salt)이다.
- Key Stretching : 개발자가 횟수를 정해서 Hash함수를 돌리는 방법이다. 하지만, Hash함수를 여러 번 돌리는 만큼 최종 다이제스트를 얻는데 시간이 소요되기 때문에 속도면에서 불리하다.
- 몇번 돌렸는지 횟수를 알게 되면, 공격하는 입장에서 상징성 있느느 대표 문자열들을 추려보면 충분히 공격이 가능하다. 그래서 이를 방지하기 위해 나온것이 Salt이다.
- 해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것을 말한다. 즉, "소금친다"라고 생각하면 된다.
- 이러면 다이제스트를 알아낸다 하더라도 password를 알아내기 더욱 어려워지며, 사용자마다 다른 Salt를 사용한다면 같은 비밀번호더라도 다이제스트의 값은 달라진다. 결국 한명의 패스워드가 유출되더라도 같은 비밀번호를 사용하는 다른 사용자는 비교적 안전하다는 의미이다.