일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Android
- proguard
- MaridDB
- node
- memory structure
- window
- react-native
- Express
- ssh key
- Mongoose
- elemMatch
- Java
- Git
- multidex
- event-driven
- Modulization
- PBKDF2
- API테스트
- MEAN stack
- centos
- rest-assured
- OOP
- pbkdf2-password
- Setup
- iIntelliJ
- Mongo
- instance
- 64k method
- 다중 서버 명령
- Linux
- Today
- Total
천줄코딩도 한 걸음부터
Node.js 비밀번호 보안(Password Security) 본문
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'); } }); }) });
'Others' 카테고리의 다른 글
MongoDB 기존 document에 데이터 추가하기 $push (0) | 2017.07.06 |
---|---|
Mongoose로 Node.js와 연결 시 DeprecationWarning (0) | 2017.07.06 |
MongoDB를 통해 Node.js에서 간단한 REST API 구현 (0) | 2017.07.06 |
Express에서 Mongoose로 DB 연결 (0) | 2017.07.06 |
Window 32bit MongoDB 설치하기 (0) | 2017.07.06 |