Bouncy Castle需要很长时间来生成RSA密钥对

时间:2017-06-05 09:27:23

标签: c# sql .net rsa bouncycastle

我有一个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)

1 个答案:

答案 0 :(得分:1)

如果密钥生成器做得很好,它将使用高熵随机数生成器。这些将尝试从服务器中尽可能多地收集“外部”随机性,并且好的生成器将暂停并可能估计所收集的随机性。

随机源(如果您没有特定的硬件可用)是用户输入,硬件事件(如网络流量和USB中断)和定时器抖动(当CPU时钟因负载而发生变化时可能会发生变化)。

在服务器上,很难收集足够的熵来生成好的密钥(由于缺少用户输入和外围设备数量减少)。

因此,在没有特殊硬件的情况下尝试生成大量密钥会导致 缓慢或质量不佳。

在这种情况下,最好使用硬件源(例如http://onerng.info/)。