RandomNumberGenerator vs RNGCryptoServiceProvider
Laut MSDN-Dokumentation für RandomNumberGenerator:
Anwendung code nicht direkt verwenden Sie diese Klasse. Diese abstrakte Klasse wird als Basisklasse für alle kryptografischen Zufallszahlengeneratoren.
Für eine Implementierung des cryptographic random number generator, verwenden Sie die abgeleitete Klasse RNGCryptoServiceProvider.
Aber ich habe den folgenden code verwendet, auf ein paar Gelegenheiten in unterschiedlichen code-Basen:
byte[] bytes = new byte[...];
RandomNumberGenerator rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
Insbesondere mit StackExchange (was ich davon ausgehen, enthält SO) und auch mit BCrypt.Net.
Daher bin ich ein wenig verwirrt - welche Art von RandomNumberGenerator
ist der obige code wird zurückgeben? Auch ist es ein bisschen ein Manko, dass einige code-Basen sind Verwendung RandomNumberGenerator
eher als RNGCryptoServiceProvider
?
Ich gehe davon aus RandomNumberGenerator.Create()
tut unter der Haube, die ich bin völlig hier fehlt, ist aber technisch (wie es eine abstrakte Klasse) sollte nicht mit dem obigen code einen Fehler auslösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
RandomNumberGenerator.Create()
MethodenaufrufeRandomNumberGenerator.Create("System.Security.Cryptography.RandomNumberGenerator")
, die schließlich erstellen Sie eine Instanz derRNGCryptoServiceProvider
.(Es hat einige lookups in ein paar Wörterbücher, so ist es wahrscheinlich, dass Sie können ändern das Verhalten der call-by-Registrierung ein Standard-random-generator geliefert).
Dem tatsächlichen Typ des Objekts zurückgegeben wird zur Kompilierzeit nicht bekannt, es ist nur bekannt, dass es Erben die
RandomNumberGenerator
Klasse, so können Sie eineRandomNumberGenerator
Referenzvariable für Sie.Diese Art der Erstellung von verschiedenen Arten von Instanzen je nach dem Eingang ist in ein paar stellen in dem Rahmen, zum Beispiel durch die
WebRequest.Create
Methode.Jemand bei Micrsoft hat "Feste" die aktuelle Dokumentation (framework 4.5) für die
Create()
Methode. Jetzt heißt es:In der Dokumentation für das framework 4.0 sagt:
Dies ist die richtige Beschreibung, was die Methode tut. Ich werde in einen Antrag zu stellen, dass die Beschreibung zurück, die in den neueren Unterlagen.
RNGCryptoServiceProvider
" - Was ist das Kriterien dafür obwohl? Warum nichtAesCryptoServiceProvider
/SHA512
/DAS
etc. speziell? Ist es nur der gleiche Ansatz mitRNGCryptoServiceProvider
dassRandomNumberGenerator
d.h. nicht, dass intern entscheiden, welcher Algorithmus benutzt es unter der Haube?AesCryptuServiceProvider
ist ein Verschlüsselungs-Algorithmus, der nicht einem random number generator. Der random number generator ist nicht spezifisch für die verschiedenen Verschlüsselungs-algorithmen. Der einzige Grund, um es möglich zu registrieren, einen anderen generator, ist, dass jemand finden könnte, dass die aktuelle Umsetzung nicht produzieren, die gut genug Zufallszahlen.CryptoServiceProvider
's RNG' s! So realistisch es nur eine Implementierung des RNG-Teil des Frameworks und es istRNGCryptoServiceProvider
daher ist es egal welche ich verwende?RNGCryptoServiceProvider
ersetzt werden kann durch eine andere Implementierung, die in Zukunft Rahmenbedingungen, und dann dieCreate()
Methode zurück, dass statt. Wenn dieRNGCryptoServiceProvider
gefunden wird, der zu schwach ist, Sie möglicherweise erstellen möchten, die einem bestimmten Anbieter statt, aber es gibt nichts, was Sie dagegen tun können, dass jetzt, so mit derCreate()
Methode ist die zukunftssichere Lösung.In der Dokumentation für
RandomNumberGenerator
ist im Grunde versaut. Als weiteres Beispiel gibt es in der Dokumentation so:... für eine statische Methode. Statische Methoden nicht überschrieben werden. Wer schrieb die Dokumentation war eindeutig nicht mehr klar denken.
Ich vermute, die ursprüngliche Absicht war, so etwas wie:
Ich denke, der code du gepostet hast (mit der statischen
Create
- Methode) ist ganz vernünftig. Es ist die gleiche Art von Muster, da ist fürXmlReader.Create
etc - die statische Methode wählt die am besten geeignete Umsetzung.RandomNumberGenerator.Create
ist eine statische factory-Methode. Sicherlich wird es wieder ein Instanzen einer abgeleitet Klasse. Und das ist nicht Abstrakt das ist alles legal.Abstrakte Klassen sind gemacht überall verwendet werden, anstatt eine konkrete Klasse. Sie sind gedacht, um eine Versionierung-freundliche Schnittstelle.