암호화하여 db에 저장하는 방법
npm install bcrypt --save
salt 를 이용해서 비밀번호를 암호화해야된다.
const bcrypt = require('bcrypt')
const saltRounds = 10
// save 전에 func 을 진행하도록. next() 를 만나면 다시 save 로 돌아간다
userSchema.pre('save',function(next){
var user = this;
// 비밀번호를 바굴 때만 암호화를 시행하도록
if(user.isModified('password')){
// 비밀번호 암호화
bcrypt.getSalt(saltRounds, function(err, salt){
if(err) return next(err);
// 첫번째 argument : 실제 비밀번호
// hash : 암호화된 비밀번호
bcrypt.hash(user.password, salt, function(err,hash){
if(err) return next(err);
user.password = hash
next();
}
}
}else{
next()
}
})
hash : 문자열을 특정 규칙을 이용하여 다른 문자열로 치환하는 알고리즘 방식 ex: sha256
salt : 평문 암호에 salt라고 불리는 임의의 문자열을 붙인 후 암호화하면 원본 문자열을 더 찾기 어렵게 만든다.
key stretching : 평문 암호에 salt를 추가하여 암호화를 하는 작업을 수만 ~ 수십만번 반복하여 암호화하는 방식
crypto.pdkdf2 (password, salt, iterations, keylen, digest, callback)
keylen: 출력 byte
digest : 해시 알고리즘
const crypto = require('crypto');
const salt = await new Promise((resolve, reject) => {
crypto.randomBytes(64, (err, buf) => {
const salt = buf.toString('base64');
resolve(salt);
})
});
const newPassword = await new Promise((resolve, reject) => {
crypto.pbkdf2(password, salt, 100000, 64, 'sha512', (err, key) => {
if (err){
reject(err);
}
resolve(key.toString('base64'));
})
});