)nodejs의 모듈을 사용하여 비밀번호를 보안하는 방법에 대해서 알아보겠습니다.

npm의 md5 모듈을 설치합니다.
var md5 = require('md5');
모듈을 다음과 같이 불러옵니다.
app.post('/auth/login', function(req, res){
var uname = req.body.username;
var pwd = req.body.password;
for(var i=0; i<users.length; i++){
var user = users[i];
if(uname === user.username && md5(pwd+user.salt) === user.password){
req.session.displayName = user.displayName;
return req.session.save(function(){
res.redirect('/welcome');
});
}
}
res.send('Who are you? <a href="/auth/login">login</a>');
});
로그인 시 기존 비밀번호와 비교할 새롭게 입력된 비밀번호에 모듈을 사용합니다. ex) md5(pwd+user.salt)

모듈이 설치된 것을 확인, node를 실행하여 암호화 할 숫자를 다음과 같이 모듈과 함께 선언합니다. ex) 암호화 할 숫자 111 -> md5('111');

password에 암호화 된 코드를 선언합니다. 각각의 다른 salt로 인하여 외부에서는 다르지만 내부적으로는 같은 비밀번호를 갖게 됩니다.


로그인과 로그아웃이 잘 이루어진 것을 확인할 수 있었습니다.
하지만 md5는 해커들에 의해서 취약점이 쉽게 노출될 수 있는 모듈입니다.

https://crackstation.net/
다음과 같은 사이트에서 암호화 된 코드를 쉽게 변환하여 복호화할 수 있습니다.
md5 모듈을 이용한 비밀번호 보안
전체 코드
var express = require('express');
var session = require('express-session');
var FileStore = require('session-file-store')(session);
var bodyParser = require('body-parser');
var md5 = require('md5');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: '1234DSFs@adf1234!@#&asd',
resave: false,
saveUninitialized: true,
store:new FileStore()
}));
app.get('/count', function(req, res){
if(req.session.count) {
req.session.count++;
} else {
req.session.count = 1;
}
res.send('count : '+req.session.count);
});
app.get('/auth/logout', function(req, res){
delete req.session.displayName;
res.redirect('/welcome');
});
app.get('/welcome', function(req, res){
if(req.session.displayName) {
res.send(`
<h1>Hello, ${req.session.displayName}</h1>
<a href="/auth/logout">logout</a>
`);
} else {
res.send(`
<h1>Welcome</h1>
<ul>
<li><a href="/auth/login">Login</a></li>
<li><a href="/auth/register">Register</a></li>
</ul>
`);
}
});
app.post('/auth/login', function(req, res){
var uname = req.body.username;
var pwd = req.body.password;
for(var i=0; i<users.length; i++){
var user = users[i];
if(uname === user.username && md5(pwd+user.salt) === user.password){
req.session.displayName = user.displayName;
return req.session.save(function(){
res.redirect('/welcome');
});
}
}
res.send('Who are you? <a href="/auth/login">login</a>');
});
app.get('/auth/login', function(req,res){
var output = `
<h1>Login</h1>
<form action="/auth/login" method="post">
<p>
<input type="text" name="username" placeholder="username">
</p>
<p>
<input type="password" name="password" placeholder="password">
</p>
<p>
<input type="submit">
</p>
</form>
`;
res.send(output);
});
var users = [
{
username: 'swk',
password: '698d51a19d8a121ce581499d7b701668',
salt:'!@#!@##Aaa',
displayName:'swk'
},
{
username: 'K8805',
password: '698d51a19d8a121ce581499d7b701668',
salt:'!@$!$@#$',
displayName:'K5'
}
];
app.post('/auth/register', function(req, res){
var user = {
username:req.body.username,
password:req.body.password,
displayName:req.body.displayName
};
users.push(user);
req.session.displayName = req.body.displayName;
req.session.save(function(){
res.redirect('/welcome');
});
});
app.get('/auth/register', function(req, res){
var output = `
<h1>Register</h1>
<form action="/auth/register" method="post">
<p>
<input type="text" name="username" placeholder="username">
</p>
<p>
<input type="password" name="password" placeholder="password">
</p>
<p>
<input type="text" name="displayName" placeholder="displayName">
</p>
<p>
<input type="submit">
</p>
</form>
`;
res.send(output);
});
app.listen(3003, function () {
console.log('Connected 3003 port!!!');
});
그리하여 다음과 같이 더 복잡한 암호화를 할 수 있는 sha256 모듈을 사용해보겠습니다.

모듈을 설치합니다.
var sha256 = require('sha256');
모듈을 선언합니다.
app.post('/auth/login', function(req, res){
var uname = req.body.username;
var pwd = req.body.password;
for(var i=0; i<users.length; i++){
var user = users[i];
if(uname === user.username && sha256(pwd+user.salt) === user.password){
req.session.displayName = user.displayName;
return req.session.save(function(){
res.redirect('/welcome');
});
}
}
res.send('Who are you? <a href="/auth/login">login</a>');
});
로그인 시 기존 비밀번호와 비교할 새롭게 입력된 비밀번호에 모듈을 사용합니다. sha256(pwd+user.salt)
var users = [
{
username: 'swk',
password: '111',
salt:'!@#!@##Aaa',
displayName:'swk'
},
{
username: 'K8805',
password: '111',
salt:'!@$!$@#$',
displayName:'K5'
}
];
각 salt의 값을 확인

사용자의 비밀번호 값과 salt의 값을 더하여 sha256 모듈을 사용합니다.

마찬가지로 더한 값을 확인합니다.
var users = [
{
username: 'swk',
password: 'c5b5a9ed37dfee64f9879de97482c432bce6655daf6c2680ff64504c28f7696e',
salt:'!@#!@##Aaa',
displayName:'swk'
},
{
username: 'K8805',
password: 'd6ede6c095c85166adf234d8731d129ad6067685a27b991038453179ebf4a990',
salt:'!@$!$@#$',
displayName:'K5'
}
];
salt와 pwd가 더해진 값을 password에 입력


로그인이 잘 이루어지는 것을 확인합니다.
sha256 모듈은 md5보다 더 복잡하게 암호화된 코드를 가질 수 있으며
이를 기존의 패스워드 값과 더하게 되면 더 복잡한 암호화 코드를 생성할 수 있습니다.
그리고 이러한 모듈을 해시 함수라고 부릅니다.
sha256 모듈을 이용한 비밀번호 보안
전체코드
var express = require('express');
var session = require('express-session');
var FileStore = require('session-file-store')(session);
var bodyParser = require('body-parser');
var sha256 = require('sha256');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: '1234DSFs@adf1234!@#&asd',
resave: false,
saveUninitialized: true,
store:new FileStore()
}));
app.get('/count', function(req, res){
if(req.session.count) {
req.session.count++;
} else {
req.session.count = 1;
}
res.send('count : '+req.session.count);
});
app.get('/auth/logout', function(req, res){
delete req.session.displayName;
res.redirect('/welcome');
});
app.get('/welcome', function(req, res){
if(req.session.displayName) {
res.send(`
<h1>Hello, ${req.session.displayName}</h1>
<a href="/auth/logout">logout</a>
`);
} else {
res.send(`
<h1>Welcome</h1>
<ul>
<li><a href="/auth/login">Login</a></li>
<li><a href="/auth/register">Register</a></li>
</ul>
`);
}
});
app.post('/auth/login', function(req, res){
var uname = req.body.username;
var pwd = req.body.password;
for(var i=0; i<users.length; i++){
var user = users[i];
if(uname === user.username && sha256(pwd+user.salt) === user.password){
req.session.displayName = user.displayName;
return req.session.save(function(){
res.redirect('/welcome');
});
}
}
res.send('Who are you? <a href="/auth/login">login</a>');
});
app.get('/auth/login', function(req,res){
var output = `
<h1>Login</h1>
<form action="/auth/login" method="post">
<p>
<input type="text" name="username" placeholder="username">
</p>
<p>
<input type="password" name="password" placeholder="password">
</p>
<p>
<input type="submit">
</p>
</form>
`;
res.send(output);
});
var users = [
{
username: 'swk',
password: 'c5b5a9ed37dfee64f9879de97482c432bce6655daf6c2680ff64504c28f7696e',
salt:'!@#!@##Aaa',
displayName:'swk'
},
{
username: 'K8805',
password: 'd6ede6c095c85166adf234d8731d129ad6067685a27b991038453179ebf4a990',
salt:'!@$!$@#$',
displayName:'K5'
}
];
app.post('/auth/register', function(req, res){
var user = {
username:req.body.username,
password:req.body.password,
displayName:req.body.displayName
};
users.push(user);
req.session.displayName = req.body.displayName;
req.session.save(function(){
res.redirect('/welcome');
});
});
app.get('/auth/register', function(req, res){
var output = `
<h1>Register</h1>
<form action="/auth/register" method="post">
<p>
<input type="text" name="username" placeholder="username">
</p>
<p>
<input type="password" name="password" placeholder="password">
</p>
<p>
<input type="text" name="displayName" placeholder="displayName">
</p>
<p>
<input type="submit">
</p>
</form>
`;
res.send(output);
});
app.listen(3003, function () {
console.log('Connected 3003 port!!!');
});