2017-06-05 241 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

相关问题