본문 바로가기
Web/Node.js

Node.js 비밀번호 보안(Password Security)

by supdev 2017. 7. 6.

node에서 비밀번호를 암호화하기 위해 md5, sha256, pbkdf2 등의 모듈을 사용할 수 있습니다.


1. MD5(wiki 보러가기)


- md5 hashing 알고리즘을 통해 데이터를 암호화합니다.


(1) MD5 사용법

npm install md5

var md5 = require('md5'); var securePassword = md5('password');


문제점

인터넷에 검색만 해봐도 쉽게 Cracking이 가능한 문제점이 있습니다.

- 이를 보완하기 위해 salt값을 추가하는 방법이 있습니다.


(2) MD5 + salt값 추가

var md5 = require('md5'); var salt = '!%@#%asdg1613'; var securePassword = md5('password + salt');


문제점

salt값을 추가함으로써 보안이 향상되지만 여전히 시간을 들여 Cracking이 가능합니다.

같은 password를 사용하는 유저가 있다면 한 명의 정보가 유출될 시 모든 유저의 정보 또한 유출될 수 있습니다.

- 유저마다 salt 값을 다르게 설정함으로써 해결이 가능합니다.


현재 md5는 설계상의 결함들이 발견되었기 때문에 md5를 암호화로 사용하지 않는다고 합니다.



2. SHA(wiki 보러가기)


- md5보다 강력한 암호를 만들 수 있습니다.


(1) SHA-256 사용법

npm install sha256

var sha256 = require('sha256'); var securePassword = sha256(password+salt);



3. PBKDF2(영문 wiki 보러가기)


- salt값을 추가한 hashing을 원하는 횟수만큼 수행하여 암호화 강도를 높일 수 있습니다.


(1) pbkdf2-password 사용한 회원가입 및 로그인 모듈

npm install pbkdf2-password

route/index.js

// PBKDF2 - secure password
var pbkdf2Password = require('pbkdf2-password');
var hasher = pbkdf2Password();

router.get('/regist', function (req, res) {
    res.render('regist', { title: '36.5 Arts' });
});

router.post('/regist', function (req, res) {

    hasher({password: req.body.password}, function (err, pass, salt, hash) {
        var user = new User();
        user.email = req.body.email;
        user.password = hash;
        user.salt = salt;
        user.type = req.body.type;
        user.major = req.body.major;

        user.save(function (err) {
            if(err){
                console.log(err);
                res.redirect('/');
            }
            req.session.email = user.email;
            res.redirect('/');
        })
    });
});

router.post('/login', function (req, res) {
    var inputEmail = req.body.email;

    User.findOne({email: inputEmail}, function (err, user) {
        if(err) return res.status(500).send({error: 'database find failure'});
        if(!user) return res.status(404).send({error: 'user not found'});

        var inputPassword = req.body.password;
        hasher({password:inputPassword, salt:user.salt}, function (err, pass, salt, hash) {
            if(hash === user.password){
                req.session.email = user.email;
                res.redirect('/');
            }else{
                res.redirect('/auth/login');
            }
        });
    })
});