2017-06-05 510 views
0

我有一個Web API項目,在其中一個端點中,我使用Bouncy Castle庫生成RSA密鑰對。在進行一些負載測試時,在對Web API發出1500個並行請求後,我開始得到504(超時錯誤)。經過一番調查後,我意識到這是造成它的Bouncy Castle。所以現在我想用一百萬個RSA密鑰對預加載一張表,並在需要時從表中獲取它們。下面是我的代碼,我正在生成密鑰對使用BC:Bouncy Castle需要很長時間才能生成RSA密鑰對

var r = new RsaKeyPairGenerator(); 
r.Init(new KeyGenerationParameters(new SecureRandom(), 1024)); 
var keyPair = r.GenerateKeyPair(); 
var publicKey = string.Empty; 
using (var stream = new MemoryStream()) 
{ 
    var textWriter = new StreamWriter(stream); 
    var pemWriter = new PemWriter(textWriter); 
    pemWriter.WriteObject(keyPair.Public); 
    pemWriter.Writer.Flush(); 
    stream.Position = 0; 
    var sr = new StreamReader(stream); 
    publicKey = sr.ReadToEnd(); 
    textWriter.Close(); 
} 

var privateKey = string.Empty; 
using (var stream = new MemoryStream()) 
{ 
    var textWriter = new StreamWriter(stream); 
    var pemWriter = new PemWriter(textWriter); 
    pemWriter.WriteObject(keyPair.Private); 
    pemWriter.Writer.Flush(); 

    stream.Position = 0; 
    var sr = new StreamReader(stream); 
    privateKey = sr.ReadToEnd(); 
    textWriter.Close(); 
} 

那麼幾個問題,有什麼我做錯了在上面的代碼(它工作正常,但如果有什麼我做這可能是造成延遲並可以避免)?另外,如果我採用其他方法(預加載100萬個密鑰對的SQL表),那麼用100萬條記錄填充表的最佳方法是什麼? (最好使用ADO.net)

+0

由於推薦使用1024位以上的2048位密鑰,因此情況會變得更糟。也許嘗試通過.Net的RSACryptoServiceProvider() - > ExportParameters()進行比較,因爲實現將有所不同。 –

+0

我會嘗試看看RSACryptoServiceProvider是否有所作爲。謝謝 – tavier

回答

1

如果密鑰生成器做得很好,它將使用高熵隨機數生成器。這些會盡可能地從服務器上收集儘可能多的「外部」隨機性,一個好的生成器會暫停並可能估計收集到的隨機性。如果用戶輸入,硬件事件(如網絡流量和USB中斷)和定時器抖動(當CPU時鐘因負載而改變時可能會改變),則隨機性來源(如果沒有特定的硬件可用) 。

在服務器上,收集足夠的熵可能很難生成好的密鑰(由於缺少用戶輸入和減少的外設)。

試圖生成非常大量的密鑰,而不需要特殊的硬件,因此會變爲或者緩慢或質量差。

在這種情況下,硬件來源(例如http://onerng.info/)會更可取。

+0

「試圖在沒有特殊硬件的情況下生成大量的密鑰,因此會導致速度慢或質量差。」這種說法遠比有理。在沒有特殊硬件的情況下,「產生大量優質,合理速度的RSA密鑰」的技術水平並不完全相同。 –

+0

每次創建一個新的SecureRandom(),每個將從RNGCryptoServiceProvider部分播種32個字節。也許有人知道這是否會耗盡一些熵池。 –

+0

因此,根據我的發現,生成10k左右的密鑰需要很長時間(大約需要25分鐘),但所花時間在一段時間內不會增加。它總是需要10毫秒到700毫秒之間(不取決於它是第一個生成的鍵還是循環中的最後一個鍵)。我在這裏發佈了一個單獨的問題:https://stackoverflow.com/questions/44386101/how-to-fasten-rsa-key-pair-generation-process – tavier

相關問題