2015-04-01 3 views
0

У меня есть бэкэнд-приложение, написанное на Python, используемое менеджерами контента моего сайта. Пароли пользователей хэшируются с использованием функции passlib's pbkdf2_sha512. Я начал разрабатывать приложение frontend, для которого я решил использовать nodejs с React для UX.Как проверить криптографический хеш, созданный Паслином Python с помощью Node.js?

Теперь моя проблема: я не могу понять, как я могу проверить пароли, хэшированные passlib, с помощью nodejs для аутентификации моих пользователей. Внедрение Passlib кажется слишком специфичным для меня, и я не занимаюсь криптографией, чтобы понять это.

У меня есть MCF, поэтому я знаю алгоритм и тип дайджеста, соль, количество итераций и длину ключа. Как проверить этот вывод из passlib в узле? Должен ли я выбрать другой алгоритм, лучше поддерживаемый обеими платформами?

ответ

1

Окей, я обратился к sha512_crypt и нашел красивую библиотеку для узла с именем sha512crypt-node. Сама README содержит пример как для Python, так и для Node, именно то, что мне нужно. Вот небольшой пример для ppl. с помощью этих платформ:

Python:

from passlib.hash import sha512_crypt 

orig = "password" 
h = sha512_crypt.encrypt(orig) 
print("hash", h) 
# h for eg. is $6$rounds=100000$5YnTXatKh4b1pLjp$3QQjVIfjrbiTakj.wkaw1woAcFiPRAjJP2U/b3BiGW4m8OvI8x0tgw1bb63dNQWMUl1uYNDBcTO3tWgrJ6eHh1 

okay = sha512_crypt.verify(orig, h) 
print("verified", okay) 

Node:

var sha512crypt = require("sha512crypt-node").sha512crypt; 

// origHash is the hash generated by passlib  
var origHash = "$6$rounds=100000$5YnTXatKh4b1pLjp$3QQjVIfjrbiTakj.wkaw1woAcFiPRAjJP2U/b3BiGW4m8OvI8x0tgw1bb63dNQWMUl1uYNDBcTO3tWgrJ6eHh1", 
    parts = origHash.split('$'), 
    rounds = parts[2], 
    salt = '$' + parts[1] + '$' + rounds + '$' + parts[3], 
    password = "password"; 

var hash = sha512crypt(password, salt); 
console.log("verified", hash === origHash); 
0

У нас была точно такая же проблема, но переход на sha512crypt не вариант. В нашем случае пароли были сгенерированы с помощью фляжки. Приведенные ниже примеры включают регулярные хеши безопасности passlib и фляги, которые сначала генерируют HMAC с секретной солью и используют его в качестве пароля pbkdf2-sha512. См. Код ниже.

Источник находится на GitHub: https://github.com/badzong/node-verify-flask-security-passwords

var crypto = require('crypto'); 
 
var pbkdf2_sha512 = require('pbkdf2-sha512'); 
 

 
function b64trimmed(buf) { 
 
     return buf.toString('base64').replace(/=*$/, '').replace('+', '.'); 
 
} 
 

 
function b64decode(str) { 
 
     // . in Base64? 
 
     str = str.replace('.', '+'); 
 
     if (str.length % 4) { 
 
       str += '='.repeat(4 - str.length % 4); 
 
     } 
 
     return new Buffer(str, 'base64'); 
 
} 
 

 
function get_hmac(secret, password) { 
 
     var hmac = crypto.createHmac('sha512', secret).update(password).digest('base64'); 
 

 
     return hmac; 
 
} 
 

 
function get_hash(password, salt, rounds) { 
 

 
     // FIXME: KeyLenBytes is hardcoded 
 
     var h = b64trimmed(pbkdf2_sha512(password, salt, rounds, 64)); 
 
     var joined_hash = ['', 'pbkdf2-sha512', rounds, b64trimmed(salt), h].join('$'); 
 

 
     return joined_hash; 
 
} 
 

 
function verify_hash(password, stored_hash) { 
 
     var scheme = stored_hash.split('$')[1]; 
 
     var rounds = stored_hash.split('$')[2]; 
 
     var salt = stored_hash.split('$')[3]; 
 

 
     // FIXME: Maybe throw an exception 
 
     if (scheme !== 'pbkdf2-sha512') { 
 
       return false; 
 
     } 
 

 
     var h = get_hash(password, b64decode(salt), rounds); 
 

 
     return h === stored_hash; 
 
} 
 

 
function new_hash(password, rounds) { 
 

 
     // FIXME: Salt size is hardcoded 
 
     var salt = crypto.randomBytes(16); 
 

 
     return get_hash(password, salt, rounds); 
 
} 
 

 
var password = 'Example Password'; 
 

 
// Usage: 
 
var h = new_hash(password, 20000); 
 
console.log('HASH ' + h); 
 
console.log('VERIFY ' + verify_hash(password, h)); 
 

 
// Usage for passwords generated with flask_security: 
 

 
// SECURITY_PASSWORD_SALT is set in config.py and used by flask-security 
 
var SECURITY_PASSWORD_SALT = 'Many random bytes...'; 
 

 
var password_hmac = get_hmac(SECURITY_PASSWORD_SALT, password); 
 
var h = new_hash(password_hmac, 20000); 
 
console.log('HASH ' + h); 
 
console.log('VERIFY ' + verify_hash(password_hmac, h)); 
 
    

Смежные вопросы