반응형
password를 virtual 메소드로 정의한다.
몽고디비에는 비번값이 저장되지 않는다.
대신 해쉬처리된 비번이 저장된다.
userSchema
.virtual('password')
.set(function (password) {
console.log('레레레');
this._password = password;
this.salt = this.makeSalt();
this.hashed_password = this.encryptPassword(password);
console.log('virtual password set 호출됨 : ' + this.hashed_password);
})
.get(function () {
console.log('virtual password의 get 호출됨.');
return this._password;
});
addUser 함수의 save() 메소드를 통해 비밀번호가 암호화되서 hashed_password로 저장
var user = new userModel({
"id": id,
"password": password,
"name": name
});
user.save(function (err, user) {
if (err) {
callback(err, null);
return;
}
console.log('사용자 데이터 추가함');
callback(null, user);
});
입력된 비밀번호(plainText)를 salt 값을 활용해서 hashed_password로 바꾸는 함수 추가
//스키마에 모델 인스턴스에서 사용할 수 있는 메소드 추가
// 비밀번호 암호화 메소드
userSchema.method('encryptPassword', function(plainText, inSalt){
if(inSalt){
return crypto.createHmac('sha1', inSalt).update(plainText).digest('hex');
}else{
return crypto.createHmac('sha1', this.salt).update(plainText).digest('hex');
}
});
//salt 값 만들기
userSchema.method('makeSalt', function(){
return Math.round((new Date().valueOf() * Math.random())) + ' ';
});
==>
plainText를 inSalt키를 가지고 sha1 알고리즘을 사용하여 hex(16진법)로 인코딩한다.
Hmac : hash message authentication code
로그인을 할때는
암호화 된 비밀번호를 복호화해서 비교하는게 아니라
입력된 걸 같은 알고리즘으로 암호화해서 비교한다.
// 입력된 비번이랑 비교 (true / false 리턴)
userSchema.method('authenticate', function(plainText, inSalt, hashed_password){
if(inSalt){
console.log('authenticate 호출됨1 : %s => %s : ss %s %s', plainText, this.encryptPassword(plainText, inSalt), inSalt,hashed_password);
return this.encryptPassword(plainText, inSalt) === hashed_password;
}else{
console.log('authenticate 호출됨2 : %s => %s : %s', plainText, this.encryptPassword(plainText), hashed_password);
return this.encryptPassword(plainText) === hashed_password;
}
});
...
//비밀번호 확인
var user = new userModel({id : id});
var authenticated = user.authenticate(password, results[0]._doc.salt, results[0]._doc.hashed_password);
if(authenticated){
console.log('비밀번호 일치함');
callback(null, results);
}else{
console.log('비밀번호가 일치하지 않음 ');
callback(null,null);
}
결과값:
authenticate 호출됨1 : 1234 => 3dd54435da33b46f2693d1d211c200681faaadeb : ss 1418143441337 , 3dd54435da33b46f2693d1d211c200681faaadeb
반응형
'IT > web' 카테고리의 다른 글
Node.js] 모듈화 (0) | 2020.02.02 |
---|---|
Node.js] MySQL 연결, 사용자 추가, 로그인 (0) | 2020.02.01 |
Node.js] Mongoose 모듈로 DB 연결, 사용자 추가, 사용자 인증 (0) | 2020.01.28 |
Node.js] MongoDB 연결, 사용자 추가, 데이터일치여부 확인 (0) | 2020.01.28 |
Node.js] try, catch, throw (0) | 2020.01.26 |
댓글