Migrate passwords from Drupal 7 to Django

前端 未结 4 1016
南方客
南方客 2021-02-08 10:36

I am migrating a site from Drupal 7 to Django 1.4, including the current users. How can I work with the passwords that were hashed by Drupal?

According to this, Drupal 7

4条回答
  •  余生分开走
    2021-02-08 11:08

    Thank you, David Robinson, for your code. That made my day! It seems to have a flaw, though: If Drupal decided to not use 'C' but 'D' for the number of iterations, it fails. I fixed the class definition slightly:

    class DrupalPasswordHasher(BasePasswordHasher):
        algorithm = "S"
        iter_code = 'C'
        salt_length = 8
    
        def encode(self, password, salt, iter_code=None):
            """The Drupal 7 method of encoding passwords"""
            if iter_code == None:
                iterations = 2 ** _ITOA64.index(self.iter_code)
            else:
                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 = 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)
    

提交回复
热议问题