Python-Krypta in OSX

8

Ich habe eine Django-Anwendung, die auf einem Ubuntu-Rechner laufende Unix-Benutzerkennwörter zurücksetzt, aber meine Entwicklungsumgebung ist OS X und ich bin auf diese ärgerliche Situation gestoßen:

OS X:

%Vor%

Linux:

%Vor%

Beim Lesen des pydoc für crypt habe ich gesehen, dass es eine betriebssystemspezifische crypt -Implementierung verwendet, also habe ich auch den folgenden Code in beiden Systemen mit denselben Ergebnissen wie Python getestet:

%Vor%

Wie kann ich die crypt() -Implementierung von OS X die gleichen Ergebnisse wie Linux crypt() ? generieren lassen? Und warum wird das nicht von der Python-Implementierung abgedeckt (wie ich es von solchen Fällen für die plattformübergreifende Bereitstellung erwarte)?

    
Filipe Pina 24.10.2012, 15:08
quelle

3 Antworten

8

Dies liegt daran, dass Linux glibc Passwörter unterschiedlich behandelt - das Salz des Passworts unter Linux entspricht dem Hash-Typ, den es generiert. OSX crypt () ist einfach-alte DES-Verschlüsselung, (was schrecklich ist.)

glibc unterstützt eine Vielzahl von Hash-Algorithmen (MD5, Blowfish, SHA-256, usw.).

Wenn wir uns die crypt.3 ansehen > manpage, wir können sehen:

%Vor%

Also, angesichts dieser Informationen .. lassen Sie Ihr Passwort aus dem zweiten Beispiel mit Linux-Crypt

%Vor%

Zum Glück gibt es dafür eine plattformübergreifende Lösung, passlib.hash.md5_crypt .

So würden Sie es verwenden:

%Vor%

Bei Ausführung unter Linux oder OSX wird der glibc-freundliche Passwort-Hash von:

erzeugt %Vor%

Identisch mit dem Original, das auf dem Linux-Rechner erstellt wurde.

    
synthesizerpatel 24.10.2012, 15:59
quelle
5

Sie übergeben spezielle Salt-Strings an die Funktion, die glibc-spezifische Crypt-Verhalten aufrufen, die unter Mac OS X nicht verfügbar sind. Von der crypt (3) man-Seite auf Debian 6:

  

Wenn salt eine Zeichenkette ist, die mit den Zeichen "$ id $" gefolgt von einer mit "$" beendeten Zeichenkette beginnt, identifiziert ID anstelle der DES-Maschine die verwendete Verschlüsselungsmethode und bestimmt dann, wie die Der Rest der Passwort-Zeichenfolge wird interpretiert.

In Ihren Python-Beispielen weisen Sie crypt an, id von 1 zu verwenden, wodurch MD5 anstelle von DES-basiertem Hashing verwendet wird. Unter Mac OS X gibt es keine solche Erweiterung, bei der crypt ausschließlich auf DES basiert. (Mac OS X% crypt hat seine eigene Erweiterung - das Salz kann ein 9-stelliges Array sein, beginnend mit einem Unterstrich, gefolgt von 4 Bytes Iterationszählung und 4 Bytes Salz), das kein Analog in glibcs ​​Implementierung hat. )

Wenn Sie die crypt -Erweiterungen auf beiden Plattformen vermeiden und das traditionelle crypt verwenden, bei dem nur zwei Bytes möglich sind, erhalten Sie die gleichen Ergebnisse von der Funktion auf beiden Plattformen, z. B .:

%Vor%

Das ist offensichtlich aus Sicherheitssicht schrecklich. Verwenden Sie beispielsweise passlib oder py-bcrypt statt dessen. Beides wird Ihnen erheblich bessere Hashing- und plattformübergreifende Zuverlässigkeit zur gleichen Zeit bringen.

    
more tension 24.10.2012 16:03
quelle
1

Warum möchten Sie in Python eine einzige Crypt-Funktion haben? Wenn Sie in OSX laufen, möchten Sie die OSX-Version crypt (), und wenn Sie in Ubuntu laufen, wird es crypt () von Ubuntu verwenden.

Dies ist eine plattformübergreifende Lösung - Python verwendet die Krypta des Betriebssystems, um die Kompatibilität innerhalb der Umgebung sicherzustellen. Wenn Python seine eigene crypt () verwendet, dann wären die Hashes gleich - aber es würde auf OSX funktionieren und nicht auf Ubuntu (oder umgekehrt)

Sie könnten etwas schreiben oder ein Modul finden, das den Hashing-Algorithmus, den crypt in jeder Umgebung verwendet, erneut implementiert - aber auch dies würde den Zweck der plattformübergreifenden Nutzung zunichte machen. Sie würden Ihre App hardwaremäßig mit Ubunutu arbeiten, die möglicherweise andere Crypts nicht nur von OSX, sondern auch von anderen Unix- und BSD-Varianten wie RedHat, FreeBSD usw. verwendet.

    
Jonathan Vanasco 24.10.2012 15:29
quelle

Tags und Links