2017-06-05 26 views
0

Ich habe ein Web-API-Projekt, wo in einem der Endpunkte ich Bouncy Castle-Bibliothek verwenden, um RSA-Schlüsselpaare zu generieren. Bei einigen Lasttests habe ich 504 (Timeout-Fehler) nach 1500 parallelen Anfragen an meine Web-API bekommen. Nach einigen Untersuchungen stellte ich fest, dass es Bouncy Castle war, die es verursachte. Jetzt denke ich daran, einen Tisch mit 1 Million RSA-Schlüsselpaaren vorzuladen und sie von diesem Tisch zu holen, wenn ich sie brauche. Unten ist mein Code, wo ich mit BC bin Erzeugung Keypair:Bouncy Castle braucht lange, um RSA Schlüsselpaar zu generieren

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(); 
} 

So paar Fragen, gibt es alles, was ich oben im Code falsch mache (es funktioniert gut, aber wenn ich etwas tue, das ist vielleicht verursacht die Verzögerung und kann vermieden werden)? Wenn ich mit dem anderen Ansatz gehe (Vorladen der SQL-Tabelle mit 1 Million Schlüsselpaaren), was wäre dann der beste Weg, die Tabelle mit 1 Million Datensätzen zu füllen? (vorzugsweise mit ADO .net)

+0

Es wird schlimmer, da ein 2048-Bit-Schlüssel über 1024 Bit empfohlen wird. Vielleicht versuchen Sie dies über die .Net RSACryptoServiceProvider() -> ExportParameters() zum Vergleich, da die Implementierung anders sein wird. –

+0

Ich werde versuchen zu sehen, ob RSACryptoServiceProvider einen Unterschied macht. Danke – tavier

Antwort

1

Wenn der Schlüsselgenerator einen guten Job macht, wird es einen High-Entropy-Zufallszahlengenerator verwenden. Diese werden versuchen, so viel "externe" Zufälligkeit von Ihrem Server zu sammeln, wie sie können, und ein guter Generator wird anhalten und möglicherweise eine Schätzung der gesammelten Zufälligkeit vornehmen.

Zufälligkeitsquellen (wenn Sie keine spezifische Hardware zur Verfügung haben) sind Dinge wie Benutzereingaben, Hardwareereignisse (wie Netzwerkverkehr und USB-Interrupt) und Timer-Jitter (die sich ändern können, wenn CPU-Takt aufgrund von Last wechselt) .

Auf einem Server kann es schwierig sein, genügend Entropie zu sammeln, um gute Schlüssel zu generieren (aufgrund fehlender Benutzereingaben und einer reduzierten Anzahl von Peripheriegeräten).

Der Versuch, eine sehr große Anzahl von Schlüsseln ohne spezielle Hardware zu erzeugen, wird daher entweder langsame oder schlechte Qualität sein.

Eine Hardwarequelle (wie http://onerng.info/) wäre in diesem Fall vorzuziehen.

+0

"Der Versuch, eine sehr große Anzahl von Schlüsseln ohne spezielle Hardware zu erzeugen, wird daher langsam oder von schlechter Qualität sein." Diese Aussage ist viel stärker als gerechtfertigt. Es ist nicht über den Stand der Technik hinaus "eine sehr große Anzahl von RSA-Schlüsseln" von hervorragender Qualität und angemessener Geschwindigkeit ohne spezielle Hardware zu erzeugen. –

+0

Ein neues SecureRandom() wird jedes Mal erstellt und jedes wird teilweise von RNGCryptoServiceProvider 32 Byte gesetzt. Vielleicht weiß jemand anders, ob das einen Entropiepool erschöpfen wird oder nicht. –

+0

Aufgrund meiner Ergebnisse dauert es sehr lange, um etwa 10k Tasten zu generieren (dauert etwa 25 Minuten), aber die Zeit nimmt nicht über einen längeren Zeitraum zu. Es dauert immer zwischen 10 Millisekunden und 700 Millisekunden (hängt nicht davon ab, ob der erste Schlüssel erzeugt wird oder der letzte in der Schleife). Ich habe hier eine separate Frage gestellt: https://StackOverflow.com/Questions/44386101/how-to-fasten-rsa-key-pair-generation-process – tavier

Verwandte Themen