2014-02-15 4 views
3
function sha512(s){ 
    var sha = crypto.createHash('sha512'); 
    sha.update(s); 
    return sha.digest('hex'); 
}; 
exports.sha512 = sha512; 

Я использую это прямо сейчас, но я хочу переключить его на scrypt. Как я могу это сделать?Как сделать криптографический хэш с помощью криптографической библиотеки Node.js?

+0

Криптографическая библиотека узла не поддерживает шифрование. И реализация scrypt в криптографии, похоже, не будет в будущем, поскольку scrypt еще не стандартизирован. Вы должны использовать [node-scrypt] (https://github.com/barrysteyn/node-scrypt), который обертывает собственную утилиту scrypt для C++. – tsturzl

ответ

6

Вы должны использовать node-scrypt.

У этого есть ясный API и хорошая документация.

var scrypt = require("scrypt"); 
var scryptParameters = scrypt.params(0.1); 

var key = new Buffer("this is a key"); //key defaults to buffer in config, so input must be a buffer 

//Synchronous example that will output in hexidecimal encoding 
scrypt.hash.config.outputEncoding = "hex"; 
var hash = scrypt.hash(key, scryptParameters); //should be wrapped in try catch, but leaving it out for brevity 
console.log("Synchronous result: "+hash); 

//Asynchronous example that expects key to be ascii encoded 
scrypt.hash.config.keyEncoding = "ascii"; 
scrypt.hash("ascii encoded key", {N: 1, r:1, p:1}, function(err, result){ 
    //result will be hex encoded 
    //Note how scrypt parameters was passed as a JSON object 
    console.log("Asynchronous result: "+result); 
}); 
+0

Будьте предупреждены: на данный момент 'scrypt' не поддерживает' node' версии 0.11 или недавно выпущенную версию 0.12. – trysis

1

я брошу свою реализацию там: https://www.npmjs.org/package/scryptsy.

Вот пример:

var scrypt = require('scryptsy') //npm install --save scryptsy 

var key = "pleaseletmein" //can be of type 'Buffer' 
var salt = "SodiumChloride" //can be of type 'Buffer' 
var data = scrypt(key, salt, 16384, 8, 1, 64) 
console.log(data.toString('hex')) 
// => 7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b543f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d651e40dfcf017b45575887 

Документация здесь: http://cryptocoinjs.com/modules/crypto/scryptsy/

+0

Как вы рекомендуете использовать его в сценарии «проверить учетные данные пользователя»? Я предполагаю, что просто запуск веб-приложения сам хэш приведет к серьезному замедлению (поскольку Node.js является однопоточным), поэтому бы вы рекомендовали разгружать эту работу на второе, хеш-приложение, к которому основное приложение делает асинхронные HTTP-запросы? – Josh1billion

+0

Да, вы правы, вы убьете производительность своего веб-приложения. Я бы использовал cluster или child_process.fork. –

+0

Прохладный, я рассмотрю эти варианты. Спасибо за ваше понимание. – Josh1billion

1

Упрощенный barrysteyn/node-scrypt синхронизации пример с (де) сериализации:

let scrypt = require('scrypt') 
    let scryptParameters = scrypt.paramsSync(0.1) 

    function encode(s) { 
     return scrypt.kdfSync(s, scryptParameters).toString('Base64') 
    } 

    function verify(encoded, s) { 
     return scrypt.verifyKdfSync(new Buffer(encoded, 'Base64'), s) 
    } 

    // Example: 
    let s = encode('my password') // c2NyeXB0AAwAAAAI.... 
    verify(s, 'my password') //true 
    verify(s, 'my pa$$word') //false 

Испытано на узле 7.0.0, Scrypt 6.0. 3.

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