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

PEP 506

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* None ist 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* None ist 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* None ist 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 True zurück, wenn die Zeichenketten oder byte-ähnlichen Objekte *a* und *b* gleich sind, andernfalls False, unter Verwendung eines „zeitkonstanten Vergleichs“, um das Risiko von Timing-Angriffen zu verringern. Weitere Details finden Sie unter hmac.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()