Skip to main content

CSPRNG: Auch Zufallsalgorithmen müssen sicher sein!

Artikel von
feature snyk platform

9. Februar 2023

0 Min. Lesezeit

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

import random

# Generate a random integer between 0 and 10
random_number = random.randint(0, 10)

print(random_number)

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.

import hashlib
import time

t = time.localtime()
current_time = time.strftime("%H:%M:%S", t)

MD5_hash = hashlib.md5(current_time.encode())

print(MD5_hash.hexdigest())

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:

import secrets

print (secrets.token_urlsafe(16))

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.

Weiterlesen

Blog

Frontier-Modelle fanden die Schwachstellen. Nur der Angreifer fand die Angriffsketten.

Die statische Analyse fand die Schwachstellen, doch erst Live-Angriffstests bewiesen, wie sie sich zu Angriffen verketten lassen. Ein Vergleich von Evo COS, Claude Security und Claude Code Security.

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

Blog

Warum KI-Coding-Agenten immer wieder fehlerhafte Zugriffskontrollen schreiben

KI-Coding-Agenten können Autorisierungslogik erzeugen, die kompiliert und die Prüfung besteht, dabei aber die Daten eines Mandanten für einen anderen offenlegt. Erfahren Sie, warum fehlerhafte Zugriffskontrollen schwer zu erkennen sind und wie Sie sie verhindern.