对于我的应用,我会大量使用ecdh
,aes
和ecdsa
来确保用户身份验证并维护安全线路。
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
答案 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,具体取决于您的机器具有多少个核心)。