secrets — Sichere Zufallszahlen zur Verwaltung von Geheimnissen generieren¶
Hinzugefügt in Version 3.6.
Quellcode: Lib/secrets.py
Das Modul secrets wird zum Generieren kryptografisch starker Zufallszahlen verwendet, die sich zur Verwaltung von Daten wie Passwörtern, Kontoauthentifizierung, Sicherheitstoken und ähnlichen Geheimnissen eignen.
Insbesondere sollte secrets gegenüber dem Standard-Pseudo-Zufallszahlengenerator im Modul random bevorzugt werden, das für Modellierung und Simulation konzipiert ist, nicht für Sicherheit oder Kryptografie.
Siehe auch
Zufallszahlen¶
Das Modul secrets bietet Zugriff auf die sicherste Zufallsquelle, die Ihr Betriebssystem bereitstellt.
- class secrets.SystemRandom¶
Eine Klasse zum Generieren von Zufallszahlen mit den hochwertigsten Quellen des Betriebssystems. Weitere Details finden Sie unter
random.SystemRandom.
- secrets.choice(seq)¶
Gibt ein zufällig ausgewähltes Element aus einer nicht leeren Sequenz zurück.
- secrets.randbelow(exclusive_upper_bound)¶
Gibt eine Zufallszahl im Bereich [0, *exclusive_upper_bound*) zurück.
- secrets.randbits(k)¶
Gibt eine nicht-negative Ganzzahl mit *k* Zufallsbits zurück.
Generieren von Token¶
Das Modul secrets bietet Funktionen zum Generieren sicherer Token, die sich für Anwendungen wie Passwortzurücksetzungen, schwer zu erratende URLs und ähnliches eignen.
- secrets.token_bytes([nbytes=None])¶
Gibt eine zufällige Byte-Zeichenkette mit *nbytes* Bytes zurück. Wenn *nbytes*
Noneist oder nicht angegeben wird, wird ein sinnvoller Standardwert verwendet.>>> token_bytes(16) b'\xebr\x17D*t\xae\xd4\xe3S\xb6\xe2\xebP1\x8b'
- secrets.token_hex([nbytes=None])¶
Gibt eine zufällige Textzeichenkette in Hexadezimal zurück. Die Zeichenkette enthält *nbytes* Zufallsbytes, wobei jedes Byte in zwei Hexadezimalziffern umgewandelt wird. Wenn *nbytes*
Noneist oder nicht angegeben wird, wird ein sinnvoller Standardwert verwendet.>>> token_hex(16) 'f9bf78b9a18ce6d46a0cd2b0b86df9da'
- secrets.token_urlsafe([nbytes=None])¶
Gibt eine zufällige URL-sichere Textzeichenkette zurück, die *nbytes* Zufallsbytes enthält. Der Text ist Base64-codiert, sodass im Durchschnitt jedes Byte etwa 1,3 Zeichen ergibt. Wenn *nbytes*
Noneist oder nicht angegeben wird, wird ein sinnvoller Standardwert verwendet.>>> token_urlsafe(16) 'Drmhze6EPcv0fN_81Bj-nA'
Wie viele Bytes sollten Token verwenden?¶
Um gegen Brute-Force-Angriffe sicher zu sein, müssen Token über ausreichende Zufälligkeit verfügen. Was als ausreichend gilt, wird notwendigerweise zunehmen, da Computer leistungsfähiger werden und in kürzerer Zeit mehr Vermutungen anstellen können. Stand 2015 wird davon ausgegangen, dass 32 Bytes (256 Bits) Zufälligkeit für den typischen Anwendungsfall des Moduls secrets ausreichend sind.
Für diejenigen, die ihre eigene Tokenlänge verwalten möchten, können Sie explizit angeben, wie viel Zufälligkeit für Token verwendet wird, indem Sie ein Argument vom Typ int an die verschiedenen token_* Funktionen übergeben. Dieses Argument wird als Anzahl der zu verwendenden Zufallsbytes interpretiert.
Andernfalls, wenn kein Argument angegeben wird oder wenn das Argument None ist, verwenden die token_* Funktionen stattdessen einen sinnvollen Standardwert.
Hinweis
Dieser Standardwert kann jederzeit geändert werden, auch während Wartungsreleases.
Andere Funktionen¶
- secrets.compare_digest(a, b)¶
Gibt
Truezurück, wenn die Zeichenketten oder byte-ähnlichen Objekte *a* und *b* gleich sind, andernfallsFalse, unter Verwendung eines „zeitkonstanten Vergleichs“, um das Risiko von Timing-Angriffen zu verringern. Weitere Details finden Sie unterhmac.compare_digest().
Rezepte und Best Practices¶
Dieser Abschnitt zeigt Rezepte und Best Practices für die Verwendung von secrets zur Verwaltung eines grundlegenden Sicherheitsniveaus.
Generieren Sie ein achtstelliges alphanumerisches Passwort
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
Hinweis
Anwendungen sollten Passwörter nicht in einem wiederherstellbaren Format speichern, weder im Klartext noch verschlüsselt. Sie sollten gesalzen und mit einer kryptografisch starken Einweg-(unreversiblen) Hash-Funktion gehasht werden.
Generieren Sie ein zehnstelliges alphanumerisches Passwort mit mindestens einem Kleinbuchstaben, mindestens einem Großbuchstaben und mindestens drei Ziffern
import string
import secrets
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(secrets.choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
Generieren Sie eine XKCD-Stil Passphrase
import secrets
# On standard Linux systems, use a convenient dictionary file.
# Other platforms may need to provide their own word-list.
with open('/usr/share/dict/words') as f:
words = [word.strip() for word in f]
password = ' '.join(secrets.choice(words) for i in range(4))
Generieren Sie eine schwer zu erratende temporäre URL mit einem Sicherheitstoken, das für Passwortwiederherstellungsanwendungen geeignet ist
import secrets
url = 'https://example.com/reset=' + secrets.token_urlsafe()