2016-03-12 24 views
1

我正在使用NodeJS構建API。我們的主API是使用Java編寫的,其中所有的ID都是加密的(一個例子是AA35794C728A440F)。解決非常繁重的加密算法?

節點API需要使用相同的加密算法來兼容。

在對API進行測試期間,我驚訝地發現它只能處理每秒25至40個區域(取決於我測試過的AWS EC2實例)的請求數,並且CPU是最大化。

深入研究,我發現問題在於使用的算法,特別是它每個加密/解密密鑰執行1000 md5操作。

刪除加密使得吞吐量大幅增加,每秒處理1200個請求。

我堅持使用算法 - 在不影響API的許多消費者的情況下不可能進行更改,所以我需要找到一種解決方法。

我想知道什麼是最有效的方法來處理這個問題,牢記我需要能夠'加密'或'解密'?

我的問題不在於如何使算法更有效率,因爲我希望避免每個ID爲1000 md5的操作,而是繞過實際的加密本身。

我正在考慮在地圖或樹中存儲所有的密鑰(最多可能是2,300萬),然後進行查找,但是這意味着需要在存儲庫中拖拽大約30-50MB的ID,消耗大量的內存。

+3

用於緩存的50MB內存對我來說聽起來並不怎麼樣......您也可以使用memcache(可能是AWS ElastiCache)來執行實際緩存 - 這種方式可以輕鬆地在多個服務器上共享... – obe

+4

聽起來像,沒有任何代碼,每個調用都要進行一次重要派生。重要派生被設計得很慢。提供更多關於你想要完成的內容和一些代碼的信息。 – zaph

+0

:)謝謝,這是問題所在。該算法的JavaScript實現確實在每次調用時都完成了KDF。解決問題後重構致電KDF。 – NRaf

回答

1

這聽起來像沒有任何代碼,說明每次調用都要進行密鑰派生。

重要的派生被設計得很慢。提供更多關於你想要完成的內容和一些代碼的信息。

+0

但是當然,只有當你遇到蹩腳的祕密(人類難忘的密碼)而不是機器對機器通信時,才應該使用昂貴的密鑰派生。 – CodesInChaos

+0

如果機器對機器通信使用隨機密鑰,則不需要密鑰派生。 – zaph

+0

1)即使您擁有隨機密鑰,您仍經常使用密鑰派生,而不是基於密碼的昂貴變體,而不是基於密鑰的廉價變體。例如,TL​​S使用與HKDF類似的東西從主密鑰中派生出幾個密鑰。 2)OP的例子看起來像慢導致錯誤導出的例子。 – CodesInChaos

1

50MB的內存緩存聽起來並不多,我...你也可以使用內存緩存(可能AWS ElastiCache)做實際的緩存 - 這樣它可以在多個服務器上輕鬆實現共享..