2016-11-26 66 views
0

對於我的應用程序,我將大量使用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

回答

1

有什麼辦法中,我可以修改我的部件/ cipher.js類 隱蔽的加密和解密功能是忠實地 異步的。

在node.js的,一個真正同步CPU綁定操作轉換成一個異步操作的唯一方式是要麼調用它在另一個進程或寫入/修改的本機代碼,可以使用本地線程/進程和鉤作爲模塊進入node.js。

所以,如果你真的想阻止它的主要node.js executino線程,你必須將其移出node.js進程。您可以啓動一組子進程(可能使其簡單的http服務器最簡單),然後使用工作隊列爲每個加密進程排隊信息。每個加密進程只會監聽請求來執行一些加密工作。由於對該子進程的請求將是一個http請求,因此它將與主節點.js線程異步。您可以啓動儘可能多的加密進程,因爲您的計算機中有CPU(減去一個)。或者,喲甚至可以使用其他計算機進行加密處理(由於您使用http請求與他們交談,這並不重要)。

沒有什麼說其他服務器必須是Web服務器。他們可能是webSocket服務器,或者你可以在TCP之上建立自己的協議。我建議Web服務器只是因爲它們非常簡單(在node.js中只是幾行代碼),並且它們很容易擴展。

一個簡單的想法可能是創建一個羣集的加密http服務器。然後,您可以盲目地提出請求,並且nodejs集羣會自動爲您處理負載均衡和擴展。

0

使用@ronomon/crypto-async模塊。它提供了在Node的線程池中執行的真正異步的Cipher,Hash和HMAC操作,以實現多核吞吐量。您可以並行運行多個操作(最多4x-8x,具體取決於您的機器具有多少內核)。