암호화를 해주는 이유는 DB를 해커에게 해킹당할 경우 DB 안에 있는 개인정보를
가져가게 되는데 여기서 암호화를 안하게 된다면 개인정보들이 유출되어 다른 서비스까지 추가 해킹을 당해
큰 피해가 생기게 된다.
하지만 암호화를 해주게 된다면 추가 피해를 막아주고 기밀성도 보장해주므로
요즘은 거의 모든 회사에서 개인정보를 암호화를 하여 DB에 저장하게 되었습니다.
암호화를 하게 되면 그 암호화를 쉽게 해석할 수 있습니다. 그래서 해싱이랑 SALT를 번갈아가면서 하는
키스트레칭을 적용하여 데이터를 복호화 시킬수 있습니다.
이제 자세한 설명은 뒤에서 START~~!
중요한 자료를 알고리즘을 이용하여 암호문으로 변화하는 과정
암호문을 원래데이터로 변환하는 과정
암 / 복호화에 동일한 키를 사용하는 암호화 방식
대칭키는 비공개키
라고도 한다.[출처](https://k0102575.github.io/articles/2020-03/encryption)
단점
대표적인 라이브러리
암/복호화에 다른 키를 사용하는 암호화 방식
: 노출시키면 안되는 키를 Private Key
, 노출시켜도 상관 없는 키를 Publice Key
라고 한다. 보통의 경우 데이터를 중요하게 다뤄야 하는 서버 측에서는 Private Key
사용
하고 누구나 사용하는 곳에는 Publice Key
를 사용한다.
[출처](https://k0102575.github.io/articles/2020-03/encryption)
장점
단점
Hash(해시)
: 원본 데이터를 매핑시켜 완전히 다른 암호화된 데어터로 변환시키는 것.
digest(다이제스트)
: 해시에 의해 암호화된 데이터
비밀번호를 해시 함수로 돌려서 다이제스트를 생성하고 DB에 저장한다.
DB에 저장된 다이제스트가 설령 누출된다고 하더라도 단방향으로 해싱된 문자이기 때문에 복호화 불가.
단방향 암호화
: 암호문을 평문으로 복호화 할수 없는 기법
⇒ 양방향은 키를 이용하여 복호화를 할 수 있지만 단방향은 암호화만 가능하다. 이점 알아가자.!!
비밀번호 복구가 안되는가?
: 단방향은 복호화가 불가능하여 다이제스트가 DB에 저장된다. 수학적으로 복호화가 거의 불가능한 알고리즘을 쓰기 때문에 복구는 불가능하다.
비밀번호를 잃어버린다면 어떻게 찾는가?
: 찾을 방법은 없다.
: 하지만 방법은 있다?
Key Stretching(키-스트레칭)
: 개발자가 횟수를 정해서 해시함수를 돌리는 방법.
: 패스워드를 암호화 할때 가장 쉽게 생각하는 방법.
해시 함수를 N번 돌릴때 마다 값이 달라져 최종 다이제스트를 얻는다.
하지만 그만큼 시간이 소요되어 속도가 느리다.
여러번 해시 함수를 돌리더라도 횟수만 알게된다면, 해커입장에서는
문자열들을 추려보면 충분히 공격이 가능하다.그래서 이를 방지하기 위해
도입한것이 아래의 Salt
이다.
Salt
: 해시 함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것.
: 의미 그대로 뭔문에 임의의 문자열을 붙이는 의미의 소금친다(Salting)
이를 코드로 적용시키면
// 키스트레칭으로 해커방지
const hashedPassword = await bcrypt.hash(password, 10);
2의 10승을 키스트레치한 결과 값을 이렇게 불러오게 된다.