본문 바로가기
IT/web

Node.js] crypto 모듈로 비밀번호 암호화하기

by 깻잎쌈 2020. 1. 31.
반응형

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

 

Crypto | Node.js v13.7.0 Documentation

Crypto# The crypto module provides cryptographic functionality that includes a set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign, and verify functions. Use require('crypto') to access this module. const crypto = require('crypto'); const secr

nodejs.org

 

SHA-1 - Wikipedia

In cryptography, SHA-1 (Secure Hash Algorithm 1) is a cryptographic hash function which takes an input and produces a 160-bit (20-byte) hash value known as a message digest – typically rendered as a hexadecimal number, 40 digits long. It was designed by th

en.wikipedia.org

 

Crypto - node

Crypto Stability: 2 - Unstable; API changes are being discussed for future versions. Breaking changes will be minimized. See below. Use require('crypto') to access this module. The crypto module offers a way of encapsulating secure credentials to be used a

node.readthedocs.io


 

로그인을 할때는 

암호화 된 비밀번호를 복호화해서 비교하는게 아니라

입력된 걸 같은 알고리즘으로 암호화해서 비교한다.

// 입력된 비번이랑 비교 (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


 

 

 

 

 

(NodeJS) crypto 모듈을 사용한 암호화

안녕하세요. 이번 시간에는 crypto 모듈을 사용해서 비밀번호를 암호화하는 방법에 대해 알아보겠습니다. 예전 패스포트 강좌에서는 패스포트 기능 설명에 중점을 두었기 때문에 비밀번호는 그냥 평문으로 저장하는 strategy를 세웠는데요. 비밀번호를 입력받은 그대로 DB

www.zerocho.com

 

반응형

댓글