Skip to content

Instantly share code, notes, and snippets.

@kamikaze-lab
Last active August 29, 2015 14:15
Show Gist options
  • Save kamikaze-lab/d863ae50facff064529c to your computer and use it in GitHub Desktop.
Save kamikaze-lab/d863ae50facff064529c to your computer and use it in GitHub Desktop.
Drupal 7 hasher para Python/Django

Drupal 7 hasher para Python/Django

Cómo utilizar la forma en que Drupal 7 genera las contraseñas en Python con Django

  1. Objetivo y descripción
  2. Dependencias
  3. Puesta en marcha
  4. Referencias
  5. Créditos y autor

El objetivo de este snippet es mostrar la forma en que puede ser utilizado el algoritmo con el cual Drupal 7 genera las contraseñas de los usuarios, suele ser útil cuando se migra un proyecto de Drupal 7 a Python, especialmente Django.

Cuando migres los usuarios de Drupal a Django, estos podrán iniciar sesión con su anterior contraseña de manera transparente.

  • Python - The Python Language.
  • Django - The web framework for perfectionists with deadlines.
  1. Crea un módulo llamado hashers dentro de tu proyecto Django
  2. Crea una clase llamada sha512.py dentro del módulo creado
_ITOA64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'


class DrupalPasswordHasher(BasePasswordHasher):
    algorithm = "S"
    iter_code = 'D'
    salt_length = 8

    def encode(self, password, salt, iter_code=None):
        """The Drupal 7 method of encoding passwords"""
        password = password.decode().encode('utf-8')
        if iter_code is None:
            iter_code = self.iter_code
        iterations = 2 ** _ITOA64.index(iter_code)
        hash = hashlib.sha512(salt + password).digest()

        for i in range(iterations):
            hash = hashlib.sha512(hash + password).digest()

        l = len(hash)

        output = ''
        i = 0

        while i < l:
            value = ord(hash[i])
            i += 1

            output += _ITOA64[value & 0x3f]
            if i < l:
                value |= ord(hash[i]) << 8

            output += _ITOA64[(value >> 6) & 0x3f]
            if i >= l:
                break
            i += 1

            if i < l:
                value |= ord(hash[i]) << 16

            output += _ITOA64[(value >> 12) & 0x3f]
            if i >= l:
                break
            i += 1

            output += _ITOA64[(value >> 18) & 0x3f]

        longhashed = "%s$%s%s%s" % (self.algorithm, iter_code,
                                    salt, output)
        return longhashed[:54]

    def verify(self, password, encoded):
        hash = encoded.split("$")[1]
        iter_code = hash[0]
        salt = hash[1:1 + self.salt_length]
        return encoded == self.encode(password, salt, iter_code)

    def salt(self):
        return get_random_string(length=self.salt_length, allowed_chars=_ITOA64)
  1. Sobrescribe la variable de configuración PASSWORD_HASHERS de la siguiente forma:
PASSWORD_HASHERS = (
    'hashers.sha512.DrupalPasswordHasher',
    ... #Los demás hashers que quieras ocupar
  1. Listo, ahora cada contraseña que sea generada por el método make_password de Django lo hará con el algoritmo de Drupal, de esta forma tendrás consistencia en todas las contraseñas en tu base de datos.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment