Der Titel und der Körper Ihrer Frage stellen zwei verschiedene Fragen: Wie die OS Entropie erzeugt (dies sollte wirklich erhält Entropie) und wie es erzeugt Pseudozufallsdaten aus dieser Entropie. Ich beginne damit, den Unterschied zu erklären.
Woher kommt Zufälligkeit?
Es gibt zwei Arten von Zufallszahlengeneratoren (RNG):
- Pseudozufallszahlengeneratoren (PRNG), auch deterministische Zufallsbitgeneratoren (DRBG) oder Kombinationen davon genannt, sind deterministische Algorithmen, die einen variablen internen Zustand fester Größe beibehalten und ihre Ausgabe aus diesem Zustand berechnen.
- Hardware-Zufallszahlengenerator (HRNG), auch „echte“ Zufallszahlengeneratoren genannt, basieren auf physikalischen Phänomenen. "Richtig" ist eine Art Fehlbezeichnung, da es keine Informationsquellen gibt, von denen bekannt ist, dass sie wirklich zufällig sind, sondern nur Informationsquellen, von denen nicht bekannt ist, dass sie vorhersehbar sind.
Einige Anwendungen, z. B. Simulationen physikalischer Phänomene, können sich mit Zufallszahlen begnügen, die statistische Tests bestehen. Andere Anwendungen, wie die Generierung von kryptografischen Schlüsseln, erfordern eine stärkere Eigenschaft: Unvorhersehbarkeit . Unvorhersehbarkeit ist eine Sicherheitseigenschaft, nicht (nur) eine statistische Eigenschaft: Dies bedeutet, dass ein Gegner die Ausgabe des Zufallszahlengenerators nicht erraten kann. (Genauer gesagt, Sie können die Qualität des RNG messen, indem Sie die Wahrscheinlichkeit messen, mit der ein Gegner jedes Bit der RNG-Ausgabe erraten kann. Wenn die Wahrscheinlichkeit messbar von 1/2 abweicht, ist das RNG schlecht.)
Es gibt physikalische Phänomene, die zufällige Daten mit guten statistischen Eigenschaften erzeugen - zum Beispiel radioaktiven Zerfall oder astronomische Beobachtungen von Hintergrundgeräuschen oder Börsenschwankungen. Solche physikalischen Messungen erfordern eine Konditionierung ( Aufhellung ), um voreingenommene Wahrscheinlichkeitsverteilungen in eine gleichmäßige Wahrscheinlichkeitsverteilung umzuwandeln. Eine physikalische Messung, die jedem bekannt ist, ist nicht gut für die Kryptografie: Börsenschwankungen können gut für Geohashing sein , aber Sie können sie nicht zum Generieren geheimer Schlüssel verwenden .
Kryptographie erfordert Geheimhaltung : Ein Gegner muss nicht in der Lage sein, die Daten herauszufinden, die in die Konditionierung gingen. Es gibt kryptografisch sichere Pseudozufallszahlengeneratoren (CSPRNG): PRNG-Algorithmen, deren Ausgabe für die Verwendung in kryptografischen Anwendungen geeignet ist und die über gute statistische Eigenschaften verfügen . Eine der Eigenschaften, die ein CSPRNG kryptografisch sicher machen, ist, dass seine Ausgabe es einem Gegner nicht ermöglicht, den internen Zustand zu rekonstruieren (die Kenntnis aller Bits, außer eines, das von einem CSPRNG erzeugt wird, hilft nicht, das fehlende Bit zu finden). Ich werde nicht näher darauf eingehen, wie man ein CSPRNG erstellt, da dies einfach ist - Sie können Rezepte von professionellen Kryptographen befolgen (verwenden Sie einen Standard)Algorithmus wie Hash_DRBG, HMAC_DRBG oder CTR_DRBG von NIST SP 800-90A ) oder ANSI X9.31 PRNG . Das CSPRNG benötigt zwei Eigenschaften seines Zustands, um sicher zu sein:
- Der Staat muss von Anfang an und zu jeder Zeit geheim gehalten werden (obwohl die Enthüllung des Staates nicht die Ergebnisse der Vergangenheit preisgibt).
- Der Zustand muss linear sein: Das RNG darf niemals zweimal aus demselben Zustand heraus gestartet werden.
Architektur eines Zufallsgenerators
In der Praxis kombinieren fast alle guten Zufallszahlengeneratoren einen CSPRNG mit einer oder mehreren Entropiequellen . Kurz gesagt, Entropie ist ein Maß für die Unvorhersehbarkeit einer Datenquelle. Es ist schwierig, einen Zufallszahlengenerator ausschließlich auf einem Hardware-RNG aufzubauen:
- Die physischen Rohdaten müssen wahrscheinlich ohnehin aufbereitet werden, um die Wahrscheinlichkeitsdaten in eine gleichmäßige Verteilung umzuwandeln.
- Die Ausgabe der Zufallsquelle muss geheim gehalten werden.
- Entropiequellen sind im Vergleich zur Nachfrage oft langsam.
So funktioniert das RNG in einem Betriebssystem fast immer so :
- Sammeln Sie genügend Entropie , um einen unvorhersehbaren inneren Zustand aufzubauen.
- Führen Sie ein CSPRNG aus , wobei Sie die akkumulierte Entropie als Startwert verwenden, dh als Anfangswert des internen Zustands.
- Mischen Sie optional regelmäßig zusätzliche Entropie in den internen Zustand. (Dies ist nicht unbedingt erforderlich, da die Entropie nicht mit einer messbaren Rate „verbraucht“ wird . Dies hilft gegen bestimmte Bedrohungen, die den RNG-Status verlieren, ohne das gesamte System zu gefährden.)
Ein Dienst zur Generierung von Zufallszahlen ist Teil der Aufgabe eines Betriebssystems, da das Sammeln von Entropien den Zugriff auf Hardware erfordert und Entropiequellen eine gemeinsam genutzte Ressource darstellen: Das Betriebssystem muss sie zusammenstellen und die Ausgabe von ihnen ableiten, die für die jeweiligen Anwendungen geeignet ist. Im Betriebssystem ist eine pseudozufällige Konditionierung der Entropiequellen erforderlich. Es könnte genauso gut kryptografisch sicher sein, da dies nicht wesentlich schwieriger ist (und auf Betriebssystemen erforderlich ist, auf denen sich Anwendungen nicht gegenseitig vertrauen). Auf vollständig kooperativen Systemen müsste jede Anwendung intern ein eigenes CSPRNG ausführen, wenn das Betriebssystem habe sowieso keinen zur Verfügung gestellt).
Die meisten Systeme mit persistentem Speicher laden beim Booten einen RNG-Startwert von der Festplatte (ich verwende "Festplatte" als Abkürzung für jede Art von persistentem Speicher) und überschreiben den Startwert mit einigen neuen Pseudozufallsdaten, die aus diesem Startwert generiert wurden. oder falls verfügbar mit zufälligen Daten, die aus diesem Samen und einer weiteren Entropiequelle generiert wurden. Auf diese Weise wird die Entropie aus einer vorherigen Sitzung wiederverwendet, auch wenn nach einem Neustart keine Entropie verfügbar ist.
Der gespeicherte Zustand muss mit Sorgfalt überprüft werden. Weißt du noch, wie ich sagte, der Zustand muss linear sein? Wenn Sie zweimal vom selben Festplattenstatus booten, erhalten Sie dieselben RNG-Ausgaben. Wenn dies in Ihrer Umgebung möglich ist, benötigen Sie eine andere Entropiequelle. Seien Sie vorsichtig beim Wiederherstellen von Backups oder beim Klonen einer virtuellen Maschine . Eine Technik zum Klonen besteht darin, die gespeicherte Entropie mit einigen Umgebungsdaten zu mischen, die vorhersehbar, aber eindeutig sind (z. B. Zeit und MAC-Adresse). Beachten Sie, dass, wenn die Umgebungsdaten vorhersehbar sind, jeder, der über den gespeicherten VM-Status verfügt, den Startwert einer gegabelten VM-Instanz rekonstruieren kann.
Entropiequellen
Das Finden (und korrekte Verwenden) von Entropiequellen ist der schwierigste Teil der Zufallszahlengenerierung in einem Betriebssystem. Die verfügbaren Entropiequellen hängen notwendigerweise von der Hardware und der Umgebung ab, in der die Hardware ausgeführt wird.
Wenn Sie Glück haben, bietet Ihre Hardware ein Peripheriegerät, das als Entropiequelle verwendet werden kann: einen Hardware-Zufallszahlengenerator , der entweder für bestimmte Zwecke oder für Nebenzwecke vorgesehen ist. Beispielsweise:
NIST SP800-90B enthält Entwurfsrichtlinien für Hardware-RNG. Die Evaluierung eines Hardware-RNG ist schwierig . Hardware-RNG sind in der Regel heikle Tiere, die mit Vorsicht verwendet werden müssen: Viele Typen benötigen nach dem Start eine gewisse Zeit und zwischen den Lesevorgängen eine gewisse Zeit, um sich zu destabilisieren. Sie reagieren häufig auf Umgebungsbedingungen wie Temperatur usw.
Intel x86-64-Prozessoren, die auf der Ivy Bridge- Architektur basieren, stellen die RdRand
Anweisung bereit, die die Ausgabe eines CSPRNG liefert, das durch thermisches Rauschen erzeugt wird . Die meisten Smartphone- Prozessoren enthalten eine Hardware-Entropiequelle, die Android jedoch nicht immer verwendet.
Systeme, denen eine starke Entropiequelle fehlt, müssen mit der Kombination schwacher Entropiequellen und der Hoffnung , dass sie ausreichen, auskommen. Zufällige Mausbewegungen sind auf Client-Computern sehr beliebt. Möglicherweise wurde die Sicherheitsanzeige von bestimmten Kryptografieprogrammen angezeigt, die Sie zum Bewegen der Maus auffordern (auch wenn sich auf einem PC-Betriebssystem des 21. Jahrhunderts Entropie angesammelt hat, ohne dass sich die Anwendung darum kümmern muss ).
Wenn Sie sich ein Beispiel ansehen möchten, können Sie sich auch Linux ansehen. Beachten Sie jedoch, dass es nicht perfekt ist . Insbesondere /dev/random
blockiert es zu oft (weil es blockiert, bis genügend Entropie verfügbar ist, mit einem übermäßig konservativen Entropiebegriff), während /dev/urandom
es fast immer gut ist, außer beim ersten Start, aber keinen Hinweis gibt, wenn es nicht genug Entropie hat. Linux hat Treiber für viele HRNG-Geräte und sammelt Entropie von verschiedenen Geräten (einschließlich Eingabegeräten ) und Festplatten- Timings.
Wenn Sie über (vertraulichen) dauerhaften Speicher verfügen, können Sie damit Entropie von einem Start zum nächsten speichern, wie oben angegeben. Der erste Start ist eine heikle Zeit: Das System befindet sich zu diesem Zeitpunkt möglicherweise in einem ziemlich vorhersehbaren Zustand, insbesondere bei Seriengeräten, die im Wesentlichen ab Werk auf die gleiche Weise funktionieren. Einige eingebettete Geräte mit dauerhaftem Speicher werden werkseitig mit einem Startwert bereitgestellt (der von einem RNG erstellt wird, der werkseitig auf einem Computer ausgeführt wird). In virtualisierten Serverumgebungen kann die anfängliche Entropie bereitgestellt werden, wenn eine virtuelle Maschine vom Host oder von einem Entropieserver aus instanziiert wird.
Falsch gesetzte Geräte sind in der Praxis ein weit verbreitetes Problem. Eine Studie mit öffentlichen RSA-Schlüsseln ergab, dass auf vielen Servern und Geräten Schlüssel mit einem schlechten RNG generiert wurden, höchstwahrscheinlich mit einem guten PRNG, das nicht ausreichend gesetzt wurde. Als OS-Designer können Sie dieses Problem nicht alleine lösen: Es ist die Aufgabe der Entität, die die Bereitstellungskette kontrolliert, um sicherzustellen, dass der RNG beim ersten Start ordnungsgemäß festgelegt wird . Ihre Aufgabe als OS-Designer ist es, ein ordnungsgemäßes RNG bereitzustellen, einschließlich einer Schnittstelle, die diesen ersten Startwert bereitstellt, und eine ordnungsgemäße Fehlersignalisierung sicherzustellen, wenn das RNG verwendet wird, bevor es ordnungsgemäß gestartet wird.