Django中make_password输出格式不符合预期的原因是什么?
Django make_password 输出格式异常原因及解决办法
你手动传入自定义salt时,Django会切换到旧式的哈希算法(如MD5),这种算法的输出就是纯哈希字符串,而非你预期的algorithm$iterations$salt$hash结构化格式。
原因说明
Django的make_password函数设计逻辑是:
- 当不指定salt时,自动使用默认的强哈希算法(比如PBKDF2),生成包含算法、迭代次数、salt和哈希值的标准结构化字符串;
- 但如果手动传入salt,函数会降级为兼容性更强但安全性更低的旧式算法,这类算法不会保留元信息,直接输出哈希结果。
解决办法
方案一:推荐,不手动指定salt,让系统自动生成
直接调用make_password时只传密码参数,系统会自动处理salt生成和强哈希计算,输出标准格式的结果:
salted_pwd = make_password(password=password) print("salted", salted_pwd)
输出示例:pbkdf2_sha256$320000$abcdef123456$xyz789...,包含完整的算法、迭代次数、salt和哈希值,安全性更高。
方案二:特殊需求下自定义salt(不推荐)
如果必须用自定义salt,需要手动指定强哈希算法的实现类,手动调用编码方法:
from django.contrib.auth.hashers import PBKDF2PasswordHasher salt = get_random_string(length=32) hasher = PBKDF2PasswordHasher() salted_pwd = hasher.encode(password, salt) print("salted", salted_pwd)
这种方式可以生成标准格式的哈希串,但注意强哈希算法对salt长度有规范要求,需确保自定义salt符合对应算法的要求。
注意
手动指定salt会降低密码存储的安全性,Django默认的自动生成逻辑已经经过安全优化,优先推荐方案一。
内容的提问来源于stack exchange,提问作者U. Watt
相关产品推荐
相关产品推荐

