/ accounts / register / encode()中的TypeError缺少1个必需的位置参数:'迭代'

时间:2017-10-22 19:05:56

标签: python django hash passwords

我不明白为什么我会收到此错误,因为我没有删除encode()中的任何内容。它不允许我提交我的注册表。有人可以帮忙吗?

回溯:

File "C:\Users\Adila\Envs\tryFOUR\lib\site-packages\django\core\handlers\exception.py" in inner
  41.             response = get_response(request)

File "C:\Users\Adila\Envs\tryFOUR\lib\site-packages\django\core\handlers\base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Adila\Envs\tryFOUR\lib\site-packages\django\core\handlers\base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Adila\Documents\tryFOUR\src\register\views.py" in register
  13.           user = form.save(commit=False)

File "C:\Users\Adila\Documents\tryFOUR\src\custom_user\forms.py" in save
  50.       user.set_password(self.cleaned_data["password1"])

File "C:\Users\Adila\Envs\tryFOUR\lib\site-packages\django\contrib\auth\base_user.py" in set_password
  105.         self.password = make_password(raw_password)

File "C:\Users\Adila\Envs\tryFOUR\lib\site-packages\django\contrib\auth\hashers.py" in make_password
  84.     return hasher.encode(password, salt)

hashers.py:

def encode(self, password, salt, iterations):
        Sweetwords = ['road,models,table']
        Sweetwords.extend(honey_gen.gen(password, base9, [passfile.txt]))
        for i in range(base10):
            Sweetwords.extend(honeywordtweak.tweak(passwords[i], 3))
            random.shuffle(Sweetwords)

        hashes = [ ]
        for swd in sweetwords:
            hashes.append(self.hash(swd, salt, iterations))
            self.honeychecker.update_index(salt, Sweetwords.index(password))
            h = Sweetwords(salt = salt, Sweetwords = pickle.dumps(hashes))
            h.save()
            return "%s$%d$%s$%s" % (self.algorithm, iterations, salt, hashes[0])

我很困惑,我不知道我做错了什么。

---- ---- EDITED

class MyHoneywordHasher(PBKDF2PasswordHasher):
    algorithm = "honeyword_base9_tweak3_pbkdf2_sha256"
    iterations = 36000
    digest = hashlib.sha256

    def salt(self):
        salt = get_random_string()
        while Sweetwords.objects.filter(salt=salt).exists():
            salt = get_random_string()
        return salt

    def verify(self, password, encoded):
        algorithm, iterations, salt, dummy= encoded.split('$', 3)
        hashes = pickle.loads(Sweetwords.objects.get(salt=salt).Sweetwords)
        hash = self.hash(password, salt, int(iterations))
        if hash in hashes:
            return honeychecker.check_index(salt, hashes.index(hash))
            return False

settings.py:

PASSWORD_HASHERS = [
    'honeywordHasher.hashers.MyHoneywordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
]

2 个答案:

答案 0 :(得分:0)

从回溯的最后一行(return hasher.encode(password, salt)),看起来像hashesr.py只是没有传递iterations参数。要解决这个问题,您可以将其硬编码到函数中。

答案 1 :(得分:0)

请添加:

‘honeywords.hashers.HoneywordHasher'

位于PASSWORD_HASHERS顶部,在settings.py中设置var。