Wie erzeugt ein Betriebssystem Entropie für zufällige Samen?


19

Unter Linux sind die Dateien /dev/randomund/dev/urandom Dateien die blockierenden bzw. nicht blockierenden Quellen für pseudozufällige Bytes.

Sie können als normale Dateien gelesen werden:

$ hexdump /dev/random
0000000 28eb d9e7 44bb 1ac9 d06f b943 f904 8ffa
0000010 5652 1f08 ccb8 9ee2 d85c 7c6b ddb2 bcbe
0000020 f841 bd90 9e7c 5be2 eecc e395 5971 ab7f
0000030 864f d402 74dd 1aa8 925d 8a80 de75 a0e3
0000040 cb64 4422 02f7 0c50 6174 f725 0653 2444
...

Viele andere Unix-Varianten bieten auch /dev/randomund /dev/urandomohne die sperrende / nicht sperrende Unterscheidung.

Das Windows-Äquivalent ist die CryptGenRandom()Funktion .

Wie erzeugt das Betriebssystem Pseudozufälligkeit?


Welche Recherchen haben Sie durchgeführt? Haben Sie sich Standard-Websites wie Wikipedia, Security.SE oder Crypto.SE angesehen? Wikipedia hat einen Artikel dazu: en.wikipedia.org/wiki//dev/random . Wenn Wikipedia einen Artikel hat, der Ihre Frage beantwortet, ist das so ziemlich die Definition, dass nicht genug recherchiert wurde. (Wir gehen davon aus, dass Sie vor der Beantwortung dieser Frage eine erhebliche Menge an Nachforschungen anstellen und uns die von Ihnen durchgeführten Nachforschungen zeigen.)
DW

Antworten:


31

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):

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 :

  1. Sammeln Sie genügend Entropie , um einen unvorhersehbaren inneren Zustand aufzubauen.
  2. Führen Sie ein CSPRNG aus , wobei Sie die akkumulierte Entropie als Startwert verwenden, dh als Anfangswert des internen Zustands.
  3. 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 RdRandAnweisung 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/randomblockiert es zu oft (weil es blockiert, bis genügend Entropie verfügbar ist, mit einem übermäßig konservativen Entropiebegriff), während /dev/urandomes 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.


5
Freaking stellare Antwort.
Adam Maras

Das ist großartig.

"Es gibt keine Informationsquellen, von denen bekannt ist, dass sie wirklich zufällig sind", widerspreche ich. Die vorherrschende (Kopenhagener) Interpretation der Quantenmechanik besagt, dass das Ergebnis der Messung eines Systems, das sich in einer Überlagerung möglicher Ergebnisse befindet, wirklich zufällig ist, in dem Sinne, dass wir das Ergebnis niemals vorhersagen können, sondern lediglich (bestenfalls) eine Wahrscheinlichkeitsverteilung angeben können. . Quelle: Physik-Student hier
balu

3

Zusätzlich zur Gilles-Antwort können Interrupts auch zur Ermittlung der Entropie verwendet werden. Wenn Sie beispielsweise unter Linux einen Interrupt-Handler hinzufügen, können Sie festlegen, ob das Auftreten dieses Interrupts als Beitrag zum Entropiepool des Kernels verwendet werden soll.

Dies sollte natürlich niemals bei Interrupts der Fall sein, die ein Angreifer möglicherweise feststellen kann. Zum Beispiel scheint der Netzwerkverkehr (dh die daraus resultierenden Interrupts) auf den ersten Blick eine gute Quelle für Zufälligkeiten zu sein. Ein Angreifer ist jedoch möglicherweise in der Lage, Ihren Datenverkehr so ​​zu manipulieren, dass er die Zufälligkeit vorhersagen kann, die Sie für eine Operation benötigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.