将crypto类转换为异步代码

时间:2016-11-26 14:14:35

标签: node.js asynchronous encryption bluebird cryptojs

对于我的应用,我会大量使用ecdhaesecdsa来确保用户身份验证并维护安全线路。

crypto module的当前代码本质上是完全同步的。我创建了一个utils文件夹,如下所示

'use strict'

// Make async later on for performance
// Add bluebird for better error handling
const crypto = require('crypto');

let cipher = {};

cipher.createCipher = (pw) => {
  return crypto.createCipher('aes192', pw);
}

cipher.encryptText = (cipher, plainText, callback) => {
  try {
    if (!callback && !callback instanceof Function) {
      throw new Error("callback must be passed")
    }
    if (!plainText instanceof String) {
      throw new Error("2nd param must be plain text")
    }
    let encrypted = '';
    cipher.on('readable', () => {
      var data = cipher.read();
      if (data)
        encrypted += data.toString('hex');
    });
    cipher.on('end', () => {
      callback(null, encrypted);
    });
    cipher.write(plainText);
    cipher.end();
  } catch (e) {
    callback(e, null);
  }
}

cipher.decryptText = (cipher, cipherText, callback) => {

}

module.exports = cipher;

在我的测试课中,我将函数称为

const cipher = require('../components/cipher.js');
cipher.encryptText(cipher.createCipher(key), paramOne, (err, data) => {
  console.log('\n  func 1 \n');
  console.log(data);
})

console.log('break');

cipher.encryptText(cipher.createCipher('1'), 'paramTwo', (err, data) => {
  console.log('\n func 2 \n');
  console.log(data);
})

paramOne大约是10-12行文本,在asyc函数中,较低的函数应该先执行。但事实并非如此。

有没有办法可以修改我的components/cipher.js类来转换加密和解密函数,使其真正异步。

多次授权尝试将需要多次密钥交换,这是非常昂贵的CPU使用。

使用测试,我已经确认第二次调用encryptText()函数,只是在它从执行中返回一个值之后,即它等待callback一个完成。

需要一些建议/帮助请大家。 TiA

2 个答案:

答案 0 :(得分:1)

  

有什么方法可以修改我的components / cipher.js类   真实地转换加密和解密功能   异步的。

在node.js中,将真正同步的CPU绑定操作转换为异步操作的唯一方法是在另一个进程中调用它,或者编写/修改可以使用本机线程/进程并将其挂接到节点的本机代码.js作为模块。

因此,如果你真的想阻止它阻止主node.js executino线程,你必须将它移出node.js进程。您可以启动一组子进程(可能使它们简单的http服务器最简单),然后使用工作队列为每个加密进程排队信息。每个加密过程只会听取加密工作的请求。由于对该子进程的请求将是一个http请求,因此它将与主node.js线程异步。您可以启动与计算机中的CPU(减1)一样多的加密进程。或者,哟甚至可以使用其他计算机进行加密过程(这与您通过http请求与他们交谈时无关紧要。)

没有任何迹象表明其他服务器必须是Web服务器。它们可以是webSocket服务器,也可以在TCP之上制作自己的协议。我建议使用Web服务器只是因为它们非常简单(在node.js中只有几行代码)并且它们很容易扩展。

一个简单的想法可能是创建一个集群加密http服务器。然后,您可以盲目地发出请求,nodejs群集会自动为您处理负载平衡和扩展。

答案 1 :(得分:0)

使用@ronomon/crypto-async模块。它提供了在Node的线程池中执行的真正异步密码,散列和HMAC操作,以实现多核吞吐量。您可以并行运行多个操作(最多4x-8x,具体取决于您的机器具有多少个核心)。