crypto모듈을 이용한 암호화
단방향 암호화
hash방식
const crypto = require('crypto');
console.log(crypto.createHash('sha512').update('fabxoe바보').digest('base64'));
hash방식은 복호화 되지 않는 문자열을 만든다.
로그인과 같이 일반적으로 암호화에는 복호화가 필요없다.
가입시 원래 비밀번호에 대한 정보없이 hash방식으로 만들어진 문자열만 서버에 저장해두고
다음 로그인시에는 웹사이트의 비밀번호란에 타이핑한 문자열을 hash방식으로 암호화 했을때
일치하는 문자열이 서버에 있는지만 확인하자.
있으면 통과 없으면 로그인 실패처리 하면 되기 때문이다.
그러나 실제 암호값과 같지 않아도 해시처리된 값의 결과가 하나 더 있을 수도 있다고 한다.
(다른 두 개의 입력값에 대해 동일한 출력값을 내는 상황)
이대로 해시암호화만 사용하기에는 해커의 해시충돌공격에 당할 수 있다.
참고로 여기서 sha512는 hash방식 암호화 알고리즘 중 하나이다.
base64는 어떤방식으로 출력해줄지에 관한 방법이다.(base64가 가장 많이 사용되는 인코딩 방식)
pbkdf2 방식
const crypto = require('crypto');
crypto.randomBytes(64, (err, buf) =>{
const salt = buf.toString('base64');
console.log('salt', salt);
console.time('암호화')
crypto.pbkdf2('fabxoe바보', salt, 501395, 64, 'sha512', (err, key)=>{
console.log('password', key.toString('base64'));
console.timeEnd('암호화');
});
});
해시암호화만 사용하는 것이 아니라,
해시 충돌 공격을 어렵게 하기 위해 salt라는 64바이트 짜리(정하기 나름) 바이트 문자열을 만들어 비밀번호에 추가한후에 해시암호화를 한다.
salt를 비밀번호에 추가하고 iteration 횟수를 높일 수록 해시 충돌 공격에 안정적이다.
salt는 암호화된 비밀번호와 같이 저장하고, iteration은 1초 정도가 걸릴때까지 올려주면 보안에 좋다.
여기서 64는 64바이트 짜리 암호문으로 만들겠다는 의미이다.
iteration이 높을수록 비밀번호를 만들어 내는데 오래걸린다.
실무에서는 pbkdf2보다 bcrypt, ccrypt를 더 사용한다
양방향 암호화(복호화가 가능한 암호화)
대칭키방식.
aes-256방식
const crypto = require('crypto');
const cipher = crypto.createCipher('aes-256-cbc', '열쇠');
let result = cipher.update('fabxoe바보','utf8', 'base64');
result += cipher.final('base64');
console.log('암호',result)
const decipher = crypto.createDecipher('aes-256-cbc','열쇠');
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('평문', result2);
비대칭키방식.
Diffie-Hellman key exchange(공개키 교환 알고리즘 중 하나)
이산 대수방법으로 암화화 한다.
참고로 이 방법을 인수분해 기반으로 응용한 것이 RSA이다.
출처, 참조: https://www.zerocho.com