Frage

Zuerst Kontext: Ich versuche, ein Befehlszeile-basiertes Tool (Linux) zu erstellen, Anmeldung erforderlich. Konten auf diesem Tool haben nichts zu tun mit System-Level-Konten - nichts davon schaut auf / etc / passwd

.

Ich plane zum Speichern von Benutzerkonten in einer Textdatei mit dem gleichen Format (grob) als / etc / passwd.

Trotz der System-Level-Passwort-Dateien nicht verwenden, mit Krypta schien im Gegensatz zu sein eine gute Praxis zu verwenden, um die Speicherung von Kennwörtern in Klartext. (Während Krypta ist sicherlich besser als Speicherung von Passwörtern in Klartext, ich bin offen für andere Wege, dies zu tun.)

Meine Krypta Wissen wird auf dieser Basis: https://docs.python.org/2/library/crypt.html

Die Dokumentation scheint um etwas zu bitten, die nicht möglich ist: „es wird empfohlen, das vollständige crypted Passwort als Salz zu verwenden, wenn die Überprüfung nach einem Passwort. "

Hä? Wenn ich das verschlüsselte Passwort bin zu schaffen (wie in, wenn ein Benutzer erstellen record), wie kann ich das schlüsselte Passwort als Salz? Es existiert noch nicht. (Ich gehe davon aus, dass Sie das gleiche Salz für die Erstellung und Überprüfung eines Passworts verwenden.)

Ich habe versucht, das Klartext-Passwort als Salz verwendet wird. Das macht arbeiten, hat aber zwei Probleme; ein leicht zu überwinden, und ein ernst:

1) Die ersten beiden Buchstaben des Klartext-Passwort sind in der mitgelieferten schlüsselte Passwort. Sie können dieses Problem beheben, indem sie nicht die ersten beiden Schreiben Zeichen in die Datei:

user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)

2) Durch das Klartext-Passwort als Salz verwendet wird, würden Sie zu sein scheinen Verringerung der Menge an Entropie in dem System. Möglicherweise bin ich Missverständnis der Zweck des Salzes.

Die beste Praxis, die ich in der Lage bin abzuleiten ist, die ersten beiden zu verwenden, Zeichen aus dem Benutzernamen als Salz. Wäre dies angemessen, oder gibt es etwas, was ich verpasst habe, dass das eine schlechte Bewegung macht?

Mein Verständnis eines Salzes ist, dass es vor der Berechnung Passwort verhindert Hashes aus einem Wörterbuch. Ich könnte ein Standard-Salz für alle verwenden Passwörter (wie meine Initialen „JS“), aber das scheint weniger eine zu sein Belastung für einen Angreifer als die Verwendung von zwei Zeichen aus dem jeweiligen Benutzernamen.

War es hilfreich?

Lösung

Für die Nutzung der Krypta Modul:

Wenn das verschlüsselte Passwort ERZEUGEN, bieten Sie das Salz. Es könnte auch zufällig seinen Widerstand gegen Brute-Forcing zu erhöhen, solange sie die genannten Bedingungen erfüllt. Wenn eine Kennwortüberprüfung, sollten Sie den Wert von getpwname bieten, falls Sie auf einem System sind, die größeren Größen Salz unterstützt und habe es nicht selbst erzeugen.

Allgemeine Bemerkungen:

Wenn dies nichts w / Ist-System-Logins zu tun hat, gibt es nichts, was man verhindern, dass eine stärkere Methode als crypt. Sie könnten zufällig N Zeichen pro Benutzer Salz, wird in Verbindung mit dem Passwort des Benutzers in einem SHA-1-Hash.

erzeugen
string_to_hash = user.stored_salt + entered_password
successful_login = (sha1(string_to_hash) == user.stored_password_hash)

UPDATE: Während dies deutlich sicherer gegen Rainbow-Tabellen ist, oben noch die Methode Verschlüsselungs Schwächen hat. Die korrekte Anwendung eines HMAC-Algorithmus kann noch weiter Ihre Sicherheit erhöhen, sondern über mein Reich der Expertise ist.

Andere Tipps

Pythons crypt () ist ein Wrapper für das System crypt () Funktion. Von der Linux-crypt () man-Seite:

char *crypt(const char *key, const char *salt);

key is a user’s typed password.
salt is a two-character string chosen from the set [a–zA–Z0–9./]. 
This string is used to perturb the algorithm in one of 4096 
different ways.

Der Schwerpunkt liegt auf " zwei Zeichen string". Nun, wenn man sich Krypta sehen () 's Verhalten in Python:

>>> crypt.crypt("Hello", "World")
'Wo5pEi/H5/mxU'
>>> crypt.crypt("Hello", "ABCDE")
'AB/uOsC7P93EI'

Sie feststellen, dass die ersten beiden Zeichen des Ergebnisses immer mit den ersten beiden Zeichen des ursprünglichen Salzes übereinstimmen, die in der Tat das wahre zwei Zeichen-Salz selbst bilden. Das heißt, das Ergebnis der Krypta () die Form 2char-Salz + verschlüsselten Pass. Daher gibt es keinen Unterschied im Ergebnis, wenn man statt des Leitens des Zwei-Zeichen-Salz oder das Original viel Zeichen-Salz Sie die gesamte verschlüsselte Passwort übergeben.

Hinweis: der Satz [a-zA-Z0-9./] enthält 64 Zeichen, und 64 * 64 = 4096. Hier ist, wie zwei Zeichen beziehen sich auf " 4096 verschiedene Möglichkeiten".

Sie sind Missverständnis in der Dokumentation; er sagt, dass, da die Länge des Salzes abhängig von der zugrunde liegenden crypt () Implementierung variieren können, sollten Sie das gesamte schlüsselte Passwort als Salz Wert , wenn die Überprüfung Passwörter zur Verfügung stellen. Das heißt, anstatt die ersten beiden Zeichen des Abziehen des Salzes sein, nur werfen in der ganzen Sache.

Ihre Idee, das anfängliche Salz, auf dem Benutzernamen basieren scheint in Ordnung.

Hier einige allgemeine Hinweise Passwörter für das Pökeln:

  1. Im Allgemeinen werden Salze verwendet, um ranbow Tabellen zu teuer berechnen zu machen. Also, sollten Sie ein wenig randomisierte Salz auf all Ihrem Passwort-Hashes hinzufügen, und es nur im Nur-Text speichern neben dem Hash-Passwort Wert.
  2. Verwenden Sie HMAC - es ist ein guter Standard, und es ist sicherer als das Kennwort verketten und Salz.
  3. Verwenden Sie SHA1: MD5 ist gebrochen. Nichts für ungut, wenn Sie dies wissen, nur gründlich zu sein. ;)

I nicht haben das Salz eine Funktion des Passworts sein. Ein Angreifer muss eine Regenbogen-Tabelle erzeugen, eine Instant-Lookup-Datenbank von Passwörtern zu haben, aber sie würden nur das einmal tun müssen. Wenn Sie eine zufällige 32-Bit-Integer wählen, würden sie 2 ^ 32 Tabellen erzeugen müssen, die (im Gegensatz zu einem deterministischen Salz) Weg kostet, viel zu viel Speicher (und Zeit).

Für einige zusätzliche Festigkeit, können Sie die Krypta Modul erhalten md5 zu verwenden, indem ein Salz in dem Format.

$1$ABCDEFGH$

wo ABCDEFGH ist Ihr Salz-String.

>>> p = crypt.crypt('password', '$1$s8Ty3/f$')
>>> p
Out: '$1$s8Ty3/f$0H/M0JswK9pl3X/e.n55G1'
>>> p == crypt.crypt('password', p)
Out: True

(beachten Sie, dass dies ein Gnu Erweiterung Krypta, siehe "man crypt" auf einem Linux-System). MD5 (und jetzt auch SHA1) kann „gebrochen“ werden, aber sie sind immer noch relativ gut für die Passwort-Hashes, und md5 ist immer noch der Standard für Linux lokale Passwörter.

Das Passwort, oder irgendetwas aus dem Passwort abgeleitet, soll nie als Salz verwendet werden. Das Salz für ein bestimmtes Passwort sollte unberechenbar sein.

Ein Benutzername oder ein Teil des Benutzername ist erträglich, aber sogar besser wäre, zufällige Bytes aus einem Verschlüsselungs RNG.

Mit PBKDF2 finden Sie unter diesen Kommentar auf einem anderen Thread ( Python-Implementierung enthält).

Werfen Sie einen Blick auf den Artikel TrueCrypt erklärt von Björn Edström . Es enthält einfache Erklärung, wie truecrypt Arbeiten und eine einfache Python-Implementierung einiger truecrypt Funktionalität einschließlich Passwort-Management zu verstehen.

  

Er spricht über den Python crypt () Modul, nicht etwa TrueCrypt in Python

Standard crypt.crypt() in Python 2 ist nicht sehr sicher und Artikel erklärt, wie sicherere Alternativen funktionieren könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top