Frage

Ich stehe auf dieses Problem, während ich versuche, ein Stück Django -Code auf meinem OSX10.7, Python2.7 Django1.4 -System auszuführen. Wie erhalte ich get_hexDigest? Laden ich es irgendwo herunter?

Kinnovates-MacBook-Pro:platformsite Kinnovate$ sudo python manage.py runserver
Running in development mode.
Running in development mode.
Running in development mode.
Running in development mode.
Validating models...

HACKUING USER MODEL
Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x1016bc050>>
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 266, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/validation.py", line 30, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 158, in get_app_errors
    self._populate()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 67, in _populate
    self.load_app(app_name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/loading.py", line 88, in load_app
    models = import_module('.models', app_name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/models.py", line 2, in <module>
    from django_sha2 import auth
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/auth.py", line 96, in <module>
    monkeypatch()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/auth.py", line 42, in monkeypatch
    from django_sha2 import bcrypt_auth
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django_sha2-0.4-py2.7.egg/django_sha2/bcrypt_auth.py", line 10, in <module>
    from django.contrib.auth.models import get_hexdigest
ImportError: cannot import name get_hexdigest
War es hilfreich?

Lösung

Sie verwenden die Dev -Version von Django (1.4), und es gibt keine get_hexdigest Methode im entsprechenden Modul.

Lösungen:

  • Verwenden Sie 1.3 Version (es ist derzeit der letzte Stall)
  • implementieren get_hexdigest sich selbst (es kann abgeschaltet werden hier)
  • Verwenden Sie ein anderes Tool (das keine Kompatibilitätsprobleme aufweist), um Ihre Aufgabe zu lösen

Andere Tipps

Implementieren Sie die Methode selbst (Verwenden hashlib Anstatt von hashcompat):

import hashlib
from django.utils.encoding import smart_str


def get_hexdigest(algorithm, salt, raw_password):
    """
    Returns a string of the hexdigest of the given plaintext password and salt
    using the given algorithm ('md5', 'sha1' or 'crypt').
    """
    raw_password, salt = smart_str(raw_password), smart_str(salt)
    if algorithm == 'crypt':
        try:
            import crypt
        except ImportError:
            raise ValueError('"crypt" password algorithm not supported in this environment')
        return crypt.crypt(raw_password, salt)

    if algorithm == 'md5':
        return hashlib.md5(salt + raw_password).hexdigest()
    elif algorithm == 'sha1':
        return hashlib.sha1(salt + raw_password).hexdigest()
    raise ValueError("Got unknown password algorithm type in password.")

Wahrscheinlich verwenden Sie es, um Passwörter zum Vergleich zu verschlüsseln. Es stellt sich heraus, dass Django 1.5 (auch 1.4?) Jetzt eine bessere Nutzfunktion bietet:

https://docs.djangoproject.com/en/dev/topics/auth/passwords/#auth-password-storage

Speziell:

check_password (Passwort, codiert)Wenn Sie einen Benutzer manuell authentifizieren möchten, indem Sie ein Plain-Text-Kennwort mit dem Hashed-Passwort in der Datenbank vergleichen, verwenden Sie die Convenience-Funktion check_password (). Es werden zwei Argumente benötigt: das Kennwort für das Klartext und den vollständigen Wert des Feldkennworts eines Benutzers in der Datenbank, gegen das Sie sich ansehen, um sie zu überprüfen, und true zurück.

make_password (Passwort [, Salz, Hashers])Erstellt ein Hashed -Passwort in dem von dieser Anwendung verwendeten Format. Es erfordert ein obligatorisches Argument: das Passwort im Klartext. Optional können Sie einen Salz- und Hashing -Algorithmus zur Verfügung stellen, wenn Sie die Standardeinstellungen nicht verwenden möchten (erster Eintrag der Einstellung Passwort_Hashers). Derzeit unterstützte Algorithmen sind: 'pbkdf2_sha256', 'pbkdf2_sha1', 'bcrypt_sha256' (siehe BCrypt mit Django), 'Bcrypt', 'Sha1', 'MD5', 'Unalted_md5' (nur für die Rückwärtskompatibilität) und 'kryptiert', 'Unalted_md5' (nur für die Rückwärtskompatibilität) und 'kryptiert', 'Unalted_md5' (nur für die Rückwärtskompeten Sie haben die Krypta -Bibliothek installiert. Wenn das Kennwortargument keine ist, wird ein unbrauchbares Passwort zurückgegeben (eine, die nie von check_password () akzeptiert wird).

is_password_usable (coded_password)Überprüft, ob es sich bei der angegebenen Zeichenfolge um ein Hashed -Passwort handelt, das die Chance hat, gegen check_password () überprüft zu werden.

Legacy -Code

def check_master_password(raw_password):
  from django.conf import settings
  from django.contrib.auth.models import get_hexdigest

  enc_password = getattr(settings, 'MASTER_PASSWORD', None)
  if enc_password:
    algo, salt, hsh = enc_password.split('$')
    return hsh == get_hexdigest(algo, salt, raw_password)

Neuer 1,5 -Code

def check_master_password(raw_password):
  from django.conf import settings
  from django.contrib.auth.hashers import check_password
  return check_password(raw_password, getattr(settings, 'MASTER_PASSWORD', None))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top