Python crypt in OSX

Ich habe eine Django-Anwendung, die Unix-Benutzer-Passwörter, die in einer Ubuntu-Maschine, aber meine Entwicklungsumgebung ist OS X und ich habe über diese lästige Situation:

OS X:

>>> import crypt >>> crypt.crypt('test','$1$VFvON1xK$') '$1SoNol0Ye6Xk' 

Linux:

 >>> import crypt >>> crypt.crypt('test','$1$VFvON1xK$') '$1$VFvON1xK$SboCDZGBieKF1ns2GBfY50' 

Vom Lesen der pydoc für crypt , sah ich, dass es eine OS-spezifische crypt Implementierung verwendet, also habe ich auch den folgenden Code in beiden Systemen mit den gleichen Ergebnissen wie Python getestet:

 #include <unistd.h> int main() { char *des = crypt("test","$1$VFvON1xK$ls4Zz4XTEuVI.1PnYm28.1"); puts(des); } 

Wie kann ich OS X's crypt() Implementierung die gleichen Ergebnisse wie Linux crypt() generieren?
Und warum ist das nicht von der Python-Implementierung abgedeckt (wie ich es von solchen Fällen für den plattformübergreifenden Einsatz erwarten würde)?

3 Solutions collect form web for “Python crypt in OSX”

Dies ist, weil Linux's glibc Passwörter anders behandelt – das Salz des Passworts auf Linux entspricht der Art von Hash, die es erzeugt. OSX crypt () ist eindeutig DES Verschlüsselung (was schrecklich ist).

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

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

  If salt is a character string starting with the characters "$id$" followed by a string terminated by "$": $id$salt$encrypted then instead of using the DES machine, id identifies the encryption method used and this then determines how the rest of the password string is interpreted. The following values of id are supported: ID | Method --------------------------------------------------------- 1 | MD5 2a | Blowfish (not in mainline glibc; added in some | Linux distributions) 5 | SHA-256 (since glibc 2.7) 6 | SHA-512 (since glibc 2.7) 

Also, angesichts dieser Informationen .. können Sie Ihr Passwort aus dem zweiten Beispiel mit Linux's Krypta nehmen

 $1$VFvON1xK$SboCDZGBieKF1ns2GBfY50' ('test', encrypted with salt=VFvON1xK) 1 == MD5 VFvON1xK == Salt SboCDZGBieKF1ns2GBfY50 == Hashed password 

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

Hier ist, wie Sie es verwenden würde:

 from passlib.hash import md5_crypt hash = md5_crypt.encrypt("test",salt="VFvON1xK") print hash 

Wenn auf Linux oder OSX laufen, produziert das glibc freundliche Passwort Hash von:

 $1$VFvON1xK$SboCDZGBieKF1ns2GBfY50 

Identisch mit dem Original auf der Linux-Maschine produziert.

Du gehst spezialisierte Salzstränge an die Funktion, die glibc-spezifische Krypta-Verhaltensweisen aufrufen, die auf Mac OS X nicht verfügbar sind. Von der Krypta (3) Manpage auf Debian 6:

Wenn Salz eine Zeichenfolge ist, die mit den Zeichen "$ id $" beginnt, gefolgt von einer Zeichenfolge, die von "$" beendet wird … dann, anstatt die DES-Maschine zu verwenden, identifiziert id die verwendete Verschlüsselungsmethode und bestimmt dann, wie der Rest der Passwort-String wird interpretiert.

In deinen Python-Beispielen erzählst du Krypta, um eine id von 1 zu verwenden, wodurch MD5 anstelle von DES-basiertem Hashing verwendet wird. Es gibt keine solche Erweiterung auf Mac OS X, wo crypt ist streng DES-basiert. (Mac OS X's crypt hat eine eigene Erweiterung – das Salz kann ein 9-stelliges Array sein, beginnend mit einem Unterstrich, gefolgt von 4 Bytes Iterationszahl und 4 Bytes Salz – das hat kein Analog in der Umsetzung von glibc.)

Wenn Sie die crypt Erweiterungen auf beiden Plattformen vermeiden und traditionelle crypt , in denen Salz nur zwei Bytes sein kann, erhalten Sie die gleichen Ergebnisse aus der Funktion auf beiden Plattformen, zB:

 >>> crypt.crypt( "test", "S/" ) 'S/AOO.b04HTR6' 

Das ist aus Sicherheitsgründen offensichtlich schrecklich. Betrachten Sie mit etwas wie passlib oder py-bcrypt stattdessen. Entweder man bekommt Ihnen viel besser Hashing und Cross-Plattform Zuverlässigkeit zur gleichen Zeit.

Warum möchtest du in Python eine einzige Krypta-Funktion haben? Wenn du in OSX laufst, würdest du die osx-Version crypt () haben und wenn du in Ubuntu laufst, wird es ubuntu's crypt () verwenden.

Dies ist eine Cross-Plattform-Lösung – Python nutzt die OS-Krypta, um die Kompatibilität innerhalb der Umgebung zu gewährleisten. Wenn Python seine eigene Krypta () verwendet hat, dann wäre die Hashes die gleiche – aber es würde auf OSX und nicht Ubuntu (oder umgekehrt) funktionieren,

Du könntest etwas schreiben oder ein Modul finden, das den Hash-Algorithmus, der in jeder Umgebung kryptiert, umsetzt, aber das würde auch den Zweck haben, Cross-Plattform zu sein. Du würdest deine App auf Ubunutu schreiben, die verschiedene Krypten nicht nur von OSX, sondern auch von anderen Unix- und BSD-Aromen wie RedHat, FreeBSD usw. verwenden können.

  • Ist es möglich, einen 100% sicheren virtuellen privaten Server zu haben?
  • Entschlüsseln Sie eine AES-verschlüsselte Nachricht (verschlüsselt in Python) in Java
  • Warum ist AES verschlüsselte Chiffre der gleichen Saite mit der gleichen Taste immer anders?
  • AES Python Verschlüsselung und Ruby Verschlüsselung - unterschiedliche Verhalten?
  • Python-Code, der RSA verschlüsselte Datei in Chunks von 64 Bit unter Verwendung eines privaten Exponenten und Moduls entschlüsselt
  • AES-Verschlüsselung in Node.js, um die erwartete Entschlüsselung in Python zu erfüllen
  • Entschlüsseln von Strings in Python, die mit MCRYPT_RIJNDAEL_256 in PHP verschlüsselt wurden
  • Xor Verschlüsselung / Entschlüsselung einer Datei mit Python 3
  • Python-Verschlüsselung - Unerwartete Variablenrückgabe
  • Warum mein Code nicht entschlüsseln die verschlüsselte Zeichenfolge auf der Grundlage des Wörterbuchs?
  • RSA Verschlüsselung und Entschlüsselung in Python
  • Python ist die beste Programmiersprache der Welt.