Skip to content

Commit 889702d

Browse files
committed
將bcrypt改成pbkdf2,去除對native module的相依性
1 parent 4a0f688 commit 889702d

File tree

5 files changed

+57
-12
lines changed

5 files changed

+57
-12
lines changed

controllers/sign.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ var crypto = require('crypto');
1010
var config = require('../config').config;
1111
var message_ctrl = require('./message');
1212
var mail_ctrl = require('./mail');
13-
var bcrypt = require('bcrypt');
13+
var pbkdf2 = require('../libs/pbkdf2');
1414

1515
// private
1616

@@ -116,12 +116,12 @@ exports.signup = function (req, res, next) {
116116
return;
117117
}
118118

119-
// bcrypt the pass
120-
bcrypt.genSalt(config.genSalt, function (err, salt) {
119+
// PBKDF2 encryption
120+
pbkdf2.genSalt(config.genSalt, function (err, salt) {
121121
if (err) {
122122
return next(err);
123123
}
124-
bcrypt.hash(pass, salt, function (err, hash) {
124+
pbkdf2.hash(pass, salt, function (err, hash) {
125125
if (err) {
126126
return next(err);
127127
}
@@ -132,6 +132,7 @@ exports.signup = function (req, res, next) {
132132
user.name = name;
133133
user.loginname = loginname;
134134
user.pass = hash;
135+
user.salt = salt;
135136
user.email = email;
136137
user.avatar = avatar_url;
137138
user.active = false;
@@ -195,7 +196,7 @@ exports.login = function (req, res, next) {
195196
if (!user || user.pass === undefined) {
196197
return res.render('sign/signin', { error: '這個用戶不存在。' });
197198
}
198-
bcrypt.compare(pass, user.pass, function (err, equal) {
199+
pbkdf2.compare(pass, user.pass, user.salt, function (err, equal) {
199200
if (err) {
200201
return next(err);
201202
}
@@ -339,16 +340,17 @@ exports.reset_pass = function (req, res, next) {
339340
return res.render('notify/notify', {error : '錯誤的激活鏈接'});
340341
}
341342

342-
bcrypt.genSalt(config.genSalt, function (err, salt) {
343+
pbkdf2.genSalt(config.genSalt, function (err, salt) {
343344
if (err) {
344345
return next(err);
345346
}
346-
bcrypt.hash(psw, salt, function (err, hash) {
347+
pbkdf2.hash(psw, salt, function (err, hash) {
347348
if (err) {
348349
return next(err);
349350
}
350351

351352
user.pass = hash;
353+
user.salt = salt;
352354
user.retrieve_key = null;
353355
user.retrieve_time = null;
354356
user.active = true; // 用戶激活

controllers/user.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var EventProxy = require('eventproxy').EventProxy;
1818
var check = require('validator').check;
1919
var sanitize = require('validator').sanitize;
2020
var crypto = require('crypto');
21-
var bcrypt = require('bcrypt');
21+
var pbkdf2 = require('../libs/pbkdf2');
2222

2323
function get_user_by_id(id, cb) {
2424
User.findOne({_id: id}, cb);
@@ -259,7 +259,7 @@ exports.setting = function (req, res, next) {
259259
return next(err);
260260
}
261261

262-
bcrypt.compare(old_pass, user.pass, function (err, equal) {
262+
pbkdf2.compare(old_pass, user.pass, user.salt, function (err, equal) {
263263
if (err) {
264264
return next(err);
265265
}
@@ -280,12 +280,13 @@ exports.setting = function (req, res, next) {
280280
return;
281281
}
282282

283-
bcrypt.genSalt(config.genSalt, function (err, salt) {
283+
pbkdf2.genSalt(config.genSalt, function (err, salt) {
284284
if (err) {
285285
return next(err);
286286
}
287-
bcrypt.hash(new_pass, salt, function (err, hash) {
287+
pbkdf2.hash(new_pass, salt, function (err, hash) {
288288
user.pass = hash;
289+
user.salt = salt;
289290
user.save(function (err) {
290291
if (err) {
291292
return next(err);

libs/pbkdf2.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*jslint node: true, regexp: true, nomen: true, indent: 2, vars: true */
2+
3+
'use strict';
4+
5+
var crypto = require('crypto');
6+
// Bcrypt Adoptions:
7+
// bcrypt.genSalt(rounds, seed_length, callback(err, salt))
8+
// bcrypt.hash(data, salt, callback(err, encrypted))
9+
// bcrypt.compare(data, encrypted, function(err, same))
10+
11+
module.exports = {
12+
keylen: 256,
13+
iterations: 4096,
14+
genSalt: function (size, callback) {
15+
crypto.randomBytes(size, function (err, buf) {
16+
if (err) {
17+
return callback(err);
18+
}
19+
return callback(null, buf.toString('base64'));
20+
});
21+
},
22+
hash: function (data, salt, callback) {
23+
// For iteration count settings, see:
24+
// http://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pkbdf2-sha256
25+
crypto.pbkdf2(data, salt, this.iterations, this.keylen, function (err, derivedKey) {
26+
if (err) {
27+
return callback(err);
28+
}
29+
// derivedKey is string, but stores binary data
30+
var buffer = new Buffer(derivedKey);
31+
return callback(null, buffer.toString('hex'), salt);
32+
});
33+
},
34+
compare: function (data, encrypted, salt, callback) {
35+
this.hash(data, salt, function (err, hash) {
36+
if (err) {
37+
return callback(err);
38+
}
39+
return callback(null, (encrypted === hash));
40+
});
41+
}
42+
};

models/user.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var UserSchema = new Schema({
1010
name: { type: String, index: true },
1111
loginname: { type: String, unique: true },
1212
pass: { type: String },
13+
salt: { type: String },
1314
email: { type: String, unique: true },
1415
url: { type: String },
1516
profile_image_url: {type: String},

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
"nodemailer": "0.3.5",
1515
"data2xml": "0.4.0",
1616
"xss": ">=0.0.2",
17-
"bcrypt ": "*",
1817
"facebook-group-sync": "*"
1918
},
2019
"devDependencies": {

0 commit comments

Comments
 (0)