我有一个Web API项目,在其中一个端点我使用Bouncy Castle库生成RSA密钥对。在进行一些负载测试时,我在向Web API提出1500个并行请求后开始得到504(超时错误)。经过一番调查后,我意识到这是造成它的Bouncy Castle。所以现在我正在考虑用一百万个RSA密钥对预加载一个表,并在需要时从那个表中获取它们。下面是我使用BC生成密钥对的代码:
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 :(得分:1)
如果密钥生成器做得很好,它将使用高熵随机数生成器。这些将尝试从服务器中尽可能多地收集“外部”随机性,并且好的生成器将暂停并可能估计所收集的随机性。
随机源(如果您没有特定的硬件可用)是用户输入,硬件事件(如网络流量和USB中断)和定时器抖动(当CPU时钟因负载而发生变化时可能会发生变化)。
在服务器上,很难收集足够的熵来生成好的密钥(由于缺少用户输入和外围设备数量减少)。
因此,在没有特殊硬件的情况下尝试生成大量密钥会导致 缓慢或质量不佳。
在这种情况下,最好使用硬件源(例如http://onerng.info/)。