암호화는 일련의 정보를 임의의 방식을 사용해 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 "알고리즘"을 이용해 정보를 관리하는 과정이다.
Encryption의 예: 넘기 수만큼 알파벳 순서상 위치가 바뀐 알파벳 반환
shiftBy('bicycle', 2) // => 'dkezeng'
shiftBy('dkezeng', -2) // => 'bicycle'
const shiftBy = function(content, offset) {
return content.split('').map(function(letter){
return String.fromCharCode(letter.charCodeAt() + offset);
}).join('');
}
Hashing
Hashing은 어떤 문자열에 "임의의 연산"을 적용해 다른 문자열로 변환하는 것을 말한다.
실제로 Hashing을 서비스에 적용할 때, 아래 세 가지 철칙이 적용된다.
- 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다. (예, 로그인 하는데만 10초 이상씩 걸린다면)
- 최대한 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 갖는다. (따라서 보통은 직접 개발하기 보다, 주로 이미 배포된 해시 알고리즘(예 SHA1)을 쓴다)
- 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.
외부에서 만들어진 알고리즘을 이용해 해싱을 하게 되면, DB가 해커에 의해 뚤려도, 해커가 얻은 데이터를 악용하기가 쉽지 않을 것이다.
Salt
Salt는 소금처럼 암호화해야하는 값에 어떤 "별도의 값"을 추가하여 결과를 변형해주는 추가적인 안전 장치다. 함께 사용하면, Hashing의 한계를 보완해준다.
- 암호화만 해놓는다면 해시된 결과는 늘 동일할 것이다. 따라서 해시된 값과 원래 값을 테이블("Rainbow table"검색해보기!!)로 만들어서 decoding 해버리는 경우가 발생할 수 있다.
- 원본값에 임의로 약속한 별도의 문자열을 추가한 뒤 해시를 진행하게되면, 기존 해시값과 전혀 다른 해시값이 반환되어 알고리즘이 노출되더라고 원본값을 보호할 수 있게 된다.
- 기존: (암호화 하려는 값) => (hash 값) Salt 사용: (암호화 하려는 값) + (Salt용 값) => (hash 값)
Salt 사용시 주의점
- 유저와 패스워드 별로 유일한 값을 가져야 한다.
- 사용자 계정을 생성할 떄와 비밀번호를 변경할 때 마다 새로운 임의의 Salt를 사용해서 해싱해야 한다.
- Salt는 절대 재사용하지 말아야 한다.
- Salt는 DB의 유저 테이블에 같이 저장돼야 한다.
'LearningJavaScript' 카테고리의 다른 글
[AWS] S3, EC2, RDS (0) | 2020.12.15 |
---|---|
[Cookie] (0) | 2020.12.09 |
[HTTPS] (0) | 2020.12.09 |
server가 왜 있어야할까? (0) | 2020.12.03 |
require 사용법 (0) | 2020.12.03 |