본문 바로가기
Nodejs

[Node js]PBKDF2-PASSWORD로 비밀번호 암호화 하기

by ★☁︎♣︎♥︎ 2022. 2. 5.
728x90
반응형
안녕하세요! CodingLog의 우동이입니다.
이번에는 PBKDF2로 비밀번호 암호화하는 방법에 대해 설명하겠습니다.

1. PBKDF2란?

pbkdf2는 해쉬 컨테이너 알고리즘입니다. NIST(National Institute of Standards and Technology, 미국표준기술연구소)에 의해서 승인된 알고리즘이고, 미국 정부 시스템에서도 사용자 패스워드의 암호화된 다이제스트를 생성할 때 사용합니다. 

 

2. PBKDF2로 암호화

  • 개발 환경 구축
# 폴더 생성
mkdir pbk

# 폴더 열기
cd pbk

# express 프로젝트 생성
express --view=ejs .

# 모듈 설치
npm install pbkdf2-password nodemon

# package.json 스크립트 코드 추가
"scripts": { "start": "node ./bin/www" } -> "scripts": { "start": "node ./bin/www", "dev" : "nodemon ./bin/www" }

3. middlewares 폴더 생성 후 pbk.js 생성

이렇게 만들면 OK

4. 회원가입 만들기

./app.js Auth

// app.js

...
var authRouter = require('./routes/auth');	// 코드 추가
...
app.use('/auth', authRouter);			// app.use('/', indexRouter); 밑에 추가
...

./routes/auth.js 회원가입 코드

// auth.js

var express = require('express');
var router = express.Router();

router.post('/register', authController.registerUser)	// MVC 패턴으로 코드 가독성 좋게 만들기

module.exports = router;

./controllers/authController.js 회원가입 코드

// authController.js

async function registerUser(req,res,next){	// 비동기 처리
	let {user_id, user_pw, name} = req.body;
	let parameters = {
		"user_id" : user_id,
		"user_pw" : user_pw,
		"name" : name
	} // 프론트에서 받은 데이터 저장
	try {
		const 유저데이터 = await authDAO.checkUserForSignup(parameters); // 데이터가 있는지 없는지 체크
		// 유저데이터가 없다면 아래 코드로 있다면 catch문으로
		const 암호화 = await pbk.encryption(parameters); // user_pw를 암호화 및 salt값 가져오기
		parameters.user_pw = 암호화.hash;	// hash값 저장
		parameters.salt = 암호화.salt;		// salt값 저장
		const 유저데이터DB저장 = await authDAO.insertUser(parameters) 
		res.json({
			"Message": "성공",
		})
	} catch (error) {
		res.json({ error})
	}
 }

./middlewares/pbk.js 암호화 코드

// pbk.js

const bkfd2Password = require('pbkdf2-password')
cosnt hasher = bkfd2Password();

function encryption(parameters){
	return new Promise((resolve, reject) => {
		hasher({
			password : parameters.user_pw
		}, (err, pass, salt, hash) =>{
        	if(err) reject(err)
			const result = {
				salt, hash
			}
			resolve(result) // salt, 암호화된 hash 값을 보내준다.
		})
	})
}

module.exports = {
     encryption,
 }

5. 로그인 만들기

./routes/auth.js 로그인 코드

# auth.js

//추가
router.post('/login', authController.loginUser)

./controllers/authController.js 로그인 코드

// authController.js

//추가

async function login(req, res, next){
	let {user_id, user_pw} req.body;
    let parameters = {
    	"user_id" : user_id,
        "name" : name
    }
    try {
    	const 유저데이터 = await authDAO.checkUserForLogin(parameters) // 데이터가 없는지 있는지 체크
        // 유저데이터가 없으면 catch문으로, 있으면 아래코드로
        savedHash = 유저데이터.user_pw;
        savedSalt = 유저데이터.salt;
        const 복호화 = await pbk.decryption(user_pw, savedSalt, savedHash);
        res.json({
        	"Message":"성공"
        })
    } catch (error) {
    	res.json({
        	"Message":"실패",
            "Error_Message" : error
        })
    }
}

./middlewares/pbk.js 복호화 코드

// pbk.js
...
// 추가
function decryption(password, savedSalt, savedHash){
    return new Promise((resolve, reject) => {
        hasher({
            password : password,
            salt : savedSalt
        }, (err, pass, salt, hash) =>{
            if(savedHash === hash){
                resolve('로그인 성공')
            } else{
                reject('비밀번호 오류')
            }
        })
    })
}

module.exports = {
	...,
    decryption,
}

DAO 코드도 마찬가지로 폴더 생성 후 module.exports = {} 방식으로 사용하면 됩니다!

 

이상으로 pbkdf2-password를 미들웨어로 사용하는 방법을 마치겠습니다!! 고생하셨습니다.

728x90
반응형

댓글