No Authentication
Client
Server
DB
정보 요청 Get/ email
Response/ email, phone number, etc ...
Authentication ( Plaintext )
Client
Server
DB
Response/ email, phone number, etc ...
email: asdf@gmail.com
password: asdfasdf
email: asdf@gmail.com
password: asdfasdf
비교
asdf@gmail.com 의
phone_number, address, etc ... 요청
Encryption
암호화는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여
해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록
'알고리즘'을 이용해 정보를 전달하는 과정
Encryption: 예
shiftBy('bicycle', 2) // => 'dkezeng'
shiftBy('dkezeng', -2) // => 'bicycle'
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('');
};
넘긴 수만큼 위치가 바뀐 알파벳 반환
shiftBy('a', 2) => abcd ... => 'c'
Authentication ( Encryption )
Client
Server
DB
Response/ email, phone number, etc ...
email: asdf@gmail.com
password: asdfasdf
email: asdf@gmail.com
password: cufhcufh
비교
asdf@gmail.com 의
phone_number, address, etc ... 요청
password 암호화
'asdfasdf' ========> 'cufhcufh'
Hashing
어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야한다
2. 최대한 해시 값을 피해야하며, 모든 값은 고유한 해시 값을 가진다
3. 아주 작은 단위의 변경 이라도 완전히 다른 해시 값을 가져야 한다
Authentication ( Hashing )
Client
Server
DB
Response/ email, phone number, etc ...
email: asdf@gmail.com
password: asdfasdf
email: asdf@gmail.com
password: 0g7s80a...
비교
asdf@gmail.com 의
phone_number, address, etc ... 요청
password 암호화
'asdfasdf' ===hashing==> '0g7s80a...'
Salt
해시 하려는 값(원본)에 추가하는 값
1. 암호화를 진행했다면 '해당 알고리즘을 알고있는 순간' 바로 원본을 얻어낼 수 있다.
2. 원본값에 임의로 약속된 추가 문자열을 추가하여 해시를 진행하여 기존 해시값과
전혀 다른 해시 값이 반환되어 알고리즘이 노출 되더라도 원본 값을 보호할 수 있도록
하는 안전장치
3. 기존 : (암호화 하려는 값) => (hash값)
Salt 사용 : (암호화 하려는 값) + (Salt 용 값) => (hash값)
Salt
Client
Server
DB
Response/ email, phone number, etc ...
email: asdf@gmail.com
password: asdfasdf
email: asdf@gmail.com
salt: 'test'
password: 0g7s80a...
비교
asdf@gmail.com 의
phone_number, address, etc ... 요청
password 암호화
'asdfasdf' === hashing + 'test' ==> '0g7s80a...'
Crypto ( NodeJS )
Node JS 내장 암호화 모듈
const crypto = require('crypto');
const secret = 'abcdefg';
const hash = crypto.createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
Crypto ( NodeJS )
const crypto = require('crypto');
const secret = 'abcdefg';
const hash = crypto.createHmac('sha256', secret)
.update('I love cupcakes')
.digest('hex');
console.log(hash);
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
알고리즘 방식
Salt
Hashing 할 값
인코딩 방식
값 + Salt => 알고리즘으로 값 변환 => 변환 값을 입력 받은 방식으로 인코딩 => Hash 값