CSPRNG: Auch Zufallsalgorithmen müssen sicher sein!
9. Februar 2023
0 Min. LesezeitWenn ich eine Münze hoch in die Luft werfe, kenne ich die möglichen Ergebnisse: Kopf oder Zahl. Vorhersagen kann ich das Ergebnis jedoch nicht. Ich kann zwar mit einer Wahrscheinlichkeit von 50 % richtig raten, aber nicht mit absoluter Sicherheit. Bei einem Würfelwurf ist meine Chance noch geringer (1 zu 6). Trotzdem weiß ich, welche Ergebnisse möglich sind.
Computer sind in vielerlei Hinsicht hervorragend, insbesondere wenn es um Vorhersagbarkeit geht. Sie arbeiten deterministisch, weshalb es unmöglich ist, eine wirklich zufällige Zahl zu erzeugen. Mit Funktionen können wir jedoch eine annähernde Zufälligkeit erzeugen. Diese Funktionen heißen Pseudozufallszahlengeneratoren.
Sehen wir uns einen kleinen Codeausschnitt an:
Dieser Code erzeugt eine Zufallszahl zwischen 0 und 10 (einschließlich 0 und 10). Das ist vergleichbar mit dem Münzwurf und dem Würfelwurf von vorhin. Wir wissen, welche Ergebnisse möglich sind, können aber nicht genau vorhersagen, welches davon eintritt.
In der Kryptografie soll die Vorhersagbarkeit gleich null sein. Das heißt, wir dürfen niemals vorhersagen können, wie das Ergebnis ausfällt. Angenommen, wir möchten ein „zufälliges“ Token für das Zurücksetzen eines Passworts erzeugen. Dazu könnten wir den aktuellen Zeitpunkt verwenden, um einen Hashwert zu erstellen. Wird dieser in der URL zum Zurücksetzen des Passworts angezeigt, sieht er zufällig aus. Tatsächlich ist er jedoch vorhersagbar. Ein Hacker könnte sich das zunutze machen – insbesondere, wenn der Code Open Source und einsehbar ist.
Was als zufällig gilt, hängt vom jeweiligen Bereich ab. Im Casino ist beispielsweise das Drehen des Roulette-Rads zufällig, obwohl statistisch eine Wahrscheinlichkeit von 2,6 % besteht, dass sich das Ergebnis „vorhersagen“ lässt. In der Kryptografie reicht das nicht aus!
Pseudozufällig heißt nicht sicher
Wir haben uns bereits Pseudozufallszahlengeneratoren (PRNGs) angesehen, brauchen aber etwas Besseres. Damit eine Zufallszahl für kryptografische Zwecke sicher ist, muss sie unvorhersagbar und nicht wiederholbar sein und darf keine Muster aufweisen. Deshalb verwenden wir kryptografisch sichere Pseudozufallszahlengeneratoren (CSPRNGs).
Ein CSPRNG ist ein Zufallszahlengenerator, der speziell für die Sicherheit kryptografischer Anwendungen entwickelt wurde. Diese Generatoren erzeugen eine Folge von Zufallszahlen, die sich nur schwer vorhersagen oder reproduzieren lässt – selbst wenn der Algorithmus und der Initialisierungswert (Seed) bekannt sind. Anders gesagt: Die Zahlen müssen unvorhersagbar sein. Außerdem sollte ein CSPRNG eine große Menge an Zufallszahlen erzeugen können, ohne dass sich Zahlen wiederholen oder erkennbare Muster in der Zahlenfolge auftreten.
CSPRNGs kommen in vielen kryptografischen Anwendungen zum Einsatz, etwa bei der Schlüsselgenerierung, beim Passwort-Hashing und bei der Verschlüsselung. Sie werden auch für nicht kryptografische Anwendungen genutzt, zum Beispiel zum Erzeugen eindeutiger IDs, Tokens und Sitzungsschlüssel.
CSPRNG und Entropie
Woher kommt das „CS“ in CSPRNG? Die Antwort lautet: Entropie.
Entropie ist ein Maß für die Zufälligkeit oder Unsicherheit einer Datenquelle. Sie ist ein wichtiger Bestandteil eines CSPRNG. Entropiepools sind Quellen für Zufallsdaten, mit denen CSPRNGs initialisiert und regelmäßig neu initialisiert werden, damit die erzeugten Zahlen unvorhersagbar bleiben.
CSPRNGs können auf verschiedene Arten von Entropiepools zurückgreifen. Welche Pools zum Einsatz kommen, hängt von der jeweiligen Implementierung ab. Hardware-Zufallszahlengeneratoren (HRNGs) sind physische Geräte, die unterschiedliche Zufallsquellen nutzen, etwa elektronisches Rauschen, radioaktiven Zerfall oder atmosphärisches Rauschen. Sie gelten als gute Entropiequelle, da sich die physikalischen Prozesse, mit denen die Zahlen erzeugt werden, nur schwer vorhersagen oder reproduzieren lassen.
Einige Betriebssysteme stellen Entropiequellen bereit, die sich zur Initialisierung von CSPRNGs nutzen lassen. Dazu gehören beispielsweise die Dateien /dev/random und /dev/urandom auf Linux- und UNIX-ähnlichen Systemen sowie BCryptGenRandom() unter Windows. Wenn Sie Python verwenden, können Sie mit os.urandom() Zufallsbytes aus der für Ihr Betriebssystem spezifischen Zufallsquelle abrufen.
CSPRNGs können auch Entropie aus verschiedenen Umgebungsquellen gewinnen, etwa aus Netzwerkverkehr, Mausbewegungen oder Tastatureingaben. Diese Quellen sind unvorhersagbar und können gute Entropie liefern. Sie können sogar noch einen Schritt weitergehen – wie CloudFlare – und Lavaleuchten verwenden!
CSPRNG-Beispiel
Bleiben wir bei Python. So erzeugen Sie ein URL-sicheres Token:
Damit wird eine kryptografisch sichere Pseudozufallszahl erzeugt. Sie lässt sich für verschiedene Zwecke verwenden, zum Beispiel zum Erzeugen eines Tokens zum Zurücksetzen eines Passworts. Dieses Token wird dann in die URL eingefügt und könnte etwa so aussehen: https://supersecurereset.io/forgot-password?token=3PDhWtzkTo9QGAq6mvLxYA
Erfahren Sie mehr über Zufälligkeit und Sicherheit
Unsichere Zufallszahlen und die Wiederherstellung von Passwörtern sind nur ein kleiner Teil der Computersicherheit. Es braucht viel, um eine sichere Umgebung und Anwendung zu schaffen. Wir erwarten nicht, dass Sie alles wissen – deshalb gibt es Snyk Learn.
Snyk Learn ist ein hervorragendes Lernangebot mit Inhalten von Sicherheitsexpertinnen und -experten. Und das Beste daran: Es ist kostenlos. Wirklich kostenlos. Keine Demo – und auch keine Begrenzung der Anzahl an Lektionen, die Sie absolvieren können.
Wenn Sie mehr über Zufälligkeit und Methoden zur Passwortwiederherstellung erfahren möchten, sehen Sie sich diese beiden Lektionen an:
Verbessern Sie Ihre Fähigkeiten im sicheren Programmieren
Kostenlose, hochwertige Schulungen zur Entwicklersicherheit – wann und wo Sie möchten.



