Node.js : 비밀번호 암호화

김가영·2020년 10월 6일
1

Node.js

목록 보기
3/34
post-thumbnail

bcrypt 이용하기

암호화하여 db에 저장하는 방법

npm install bcrypt --save

salt 를 이용해서 비밀번호를 암호화해야된다.

  • saltRounds : salt의 글자수

User.js (Model) 에서


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()             
	}
})
      

crypto 이용

hash : 문자열을 특정 규칙을 이용하여 다른 문자열로 치환하는 알고리즘 방식 ex: sha256
salt : 평문 암호에 salt라고 불리는 임의의 문자열을 붙인 후 암호화하면 원본 문자열을 더 찾기 어렵게 만든다.
key stretching : 평문 암호에 salt를 추가하여 암호화를 하는 작업을 수만 ~ 수십만번 반복하여 암호화하는 방식

PBKDF2(Password-Based Key Derivation Function)

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'));
            })
        });
profile
개발블로그

0개의 댓글