프로그래밍/Node.js

Node.js 생활코딩 정리 – Password 암호화 방법

가카리 2016. 12. 4. 18:07
반응형

Security – Password(비밀번호 보안)

 

비밀번호를 암호화하기 위해 MD5 해쉬 암호화 모듈을 설치해야한다.

 

npm install md5

 

node

var md5 = require('md5');

md5('javascript')

를 순서대로 쳐보면 javascript를 해쉬암호화한 값이 나온다.

참고로 MD5는 단방향 암호알고리즘이므로 이 암호화된 값으로 원래 값을 돌려놓을 수 없다.

 

자 이제 MD5를 알았으니 본격적인 예제를 위해

 

npm install md5 -–save를 치고 패키지에 포함시킨다.

 

var md5 = require('md5');를 추가해서 md5 모듈을 사용한다

 

다시 아래와 같이 치고 해쉬값을 복사해서 프로젝트(app_multi_user_file.js)의

여기에 복붙을 한다.(원래 111이었음)

그 다음 다음 소스를 수정함 pwd에서 md5(pwd)만 바뀜.

 

app.post('/auth/login', function(req, res){

var uname = req.body.username;//POST방식으로 보낸 값을 가져옴

var pwd = req.body.password;

 

for(var i=0; i < users.length; i++){//계정이 실제로 존재하는지 확인하는 루프

var user = users[i];

if(uname === user.username && md5(pwd) === user.password){//아이디와 패스워드 둘다 같으면

req.session.displayName = user.displayName;

return req.session.save(function(){//세션값이 세팅이 끝나면 콜백이 호출됨 return때문에 for문이 즉시 중지됨

res.redirect('/welcome');// welcome 페이지로 이동

});

if(i == (user.length-1))

res.send('who are you?<a href="/auth/login">login</a>');//이게 실행되면 사용자가 존재하지 않음

}

}

});

 

 

근데 이렇게 MD5 알고리즘은 다음과 같이 뚫리는 알고리즘이다.(헐...)

 

 

 

이건 미리 111의 해쉬 값을 저장해놨다가 데이터베이스에서 찾아서 비교해보는 방식으로 뚫은 것이다.

 

 

그러면 다음과 같이 해보자

 

그리고 다시 뚫어보자

 

 

salt하나 추가했을 뿐인데 비번을 뚫을 수 없다.

 

그럼 다시 소스로 돌아가서 (app_multi_user_file.js)

 

var salt = '!&*%%&#Adfafasfa';

var users = [

{//현재 유저는 한개만 있음

username:'egoing',

password:'979606d2739ecfad31ce145a7d479ab2',

displayName:'egoing'

}

];

 

를 수정 한 뒤

 

 

md5(pwd+salt)만 수정됨..

 

app.post('/auth/login', function(req, res){

var uname = req.body.username;//POST방식으로 보낸 값을 가져옴

var pwd = req.body.password;

 

for(var i=0; i < users.length; i++){//계정이 실제로 존재하는지 확인하는 루프

var user = users[i];

if(uname === user.username && md5(pwd+salt) === user.password){//아이디와 패스워드 둘다 같으면

req.session.displayName = user.displayName;

return req.session.save(function(){//세션값이 세팅이 끝나면 콜백이 호출됨 return때문에 for문이 즉시 중지됨

res.redirect('/welcome');// welcome 페이지로 이동

});

if(i == (user.length-1))

res.send('who are you?<a href="/auth/login">login</a>');//이게 실행되면 사용자가 존재하지 않음

}

}

});

 

실행 화면

잘된다..

 

이번에는 사용자마다 다른 salt를 적용시켜보자

 

먼저 다른 salt 값을 만들자

소스 수정

app.post('/auth/login', function(req, res){

var uname = req.body.username;//POST방식으로 보낸 값을 가져옴

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(){//세션값이 세팅이 끝나면 콜백이 호출됨 return때문에 for문이 즉시 중지됨

res.redirect('/welcome');// welcome 페이지로 이동

});

if(i == (user.length-1))

res.send('who are you?<a href="/auth/login">login</a>');//이게 실행되면 사용자가 존재하지 않음

}

}

});

 

실행 결과

새로 추가한 kch계정도 비밀번호가 111로 접속이 잘된다.

 

하지만 MD5는 권장 알고리즘이 아니므로 SHA256를 써야한다.

 

npm install sha256 --save

 

 

 

js소스에서 다음부분으로 수정

var sha256 = require('sha256');//sha256 모듈 사용

 

 

 

 

그리고 아까했던 해쉬값 만들기 작업을 반복해줌

 

 

그리고 소스에 해쉬값 복붙

 

var users = [

{

username:'egoing',

password:'203281bdb04ee4b09b9d0643cb3256b29af9b302b4fbaa77336374f6187c5441',

salt:'!&*%%&#Adfafasfa',

displayName:'egoing'

},

{

username:'kch',

password:'698c1a5e33abd0a0a33a41a372f529e519d36b7d6336a5a9c0489fc1de273602',

salt:'!1231232313%&#Adf',

displayName:'kch'

}

];

 

 

app.post('/auth/login', function(req, res){

var uname = req.body.username;//POST방식으로 보낸 값을 가져옴

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(){//세션값이 세팅이 끝나면 콜백이 호출됨 return때문에 for문이 즉시 중지됨

res.redirect('/welcome');// welcome 페이지로 이동

});

if(i == (user.length-1))

res.send('who are you?<a href="/auth/login">login</a>');//이게 실행되면 사용자가 존재하지 않음

}

}

});

 

실행 화면

잘된다. 다행..

 

결론적으로 salt값이 다르기 때문에 패스워드 해쉬 값이 노출되면 한 사람이 털려도 다른사람은 안 털리는 장점이 있다.

 

출처 : https://opentutorials.org/course/2136

반응형