【问题标题】:How do I make a scrypt hash using Node.js's crypto library?如何使用 Node.js 的加密库创建 scrypt 哈希?
【发布时间】:2014-03-15 06:40:09
【问题描述】:
function sha512(s){
    var sha = crypto.createHash('sha512');
    sha.update(s);
    return sha.digest('hex');
};
exports.sha512 = sha512;

我现在正在使用它,但我想将它切换到 scrypt。我该怎么做?

【问题讨论】:

  • Node 的加密库不支持 scrypt。由于 scrypt 还没有标准化,因此未来似乎不会将 scrypt 实现为加密。您应该使用 node-scrypt 包装原生 C++ scrypt 实用程序。
  • 同时 Node 的 Crypto 支持 scrypt。节点 10.5+
  • scrypt-kdf 是核心 Node.js 加密实现的包装器,它提供了 kdf()verify() 函数。

标签: javascript node.js hash cryptography


【解决方案1】:

你应该使用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);
});

【讨论】:

  • 警告:截至目前,scrypt 不支持node 0.11 版或新发布的0.12 版。
  • 来自node-scrypt: "#WARNING!!!这个模块已被弃用。改为使用nodejs.org/api/…"
【解决方案2】:

我将把我的实现扔在那里: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/

【讨论】:

  • 你会如何推荐在“检查用户的登录凭据”场景中使用它?我假设只是让一个 Web 应用程序运行哈希本身会导致严重的减速(因为 Node.js 是单线程的),所以你是否建议将这项工作卸载到第二个,只有哈希的应用程序主应用程序制作异步 HTTP 请求?
  • 是的,你是对的,你会牺牲你的网络应用程序的性能。我会使用集群或 child_process.fork。
  • 酷,我会研究这些选项。感谢您的洞察力。
【解决方案3】:

带有(反)序列化的简化 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 上测试。

【讨论】:

  • 不推荐使用new Buffer(string[, encoding]),因为应使用节点v6.0.0,Buffer.from(string[, encoding])Source 无论如何真的很有帮助;文档真的不清楚应该将什么类型放入 verifykdf 函数中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2011-11-20
  • 2014-06-09
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2012-04-19
相关资源
最近更新 更多