Python crypt库使用Blowfish算法加密密码返回*0的问题如何解决?
问题原因
crypt.crypt返回*0是底层加密库识别到非法参数、或当前运行环境不支持对应哈希算法时的标准错误返回值,对应你这个场景的触发原因通常有两个:
- 运行环境不支持Blowfish($2y$前缀)哈希算法:Python标准库的
crypt模块依赖操作系统底层的crypt实现,Windows原生环境完全不支持Blowfish哈希,部分精简版Linux发行版也可能没有编译对应支持。 - 盐格式不符合底层要求:你使用的盐末尾多了一个
$,Blowfish的合法盐格式为$<算法标识>$<cost参数>$<22位合法base64字符>,不需要在盐段末尾额外添加$,额外的特殊字符会被识别为非法参数。
解决方案
方案1:修正盐格式 + 确认环境支持
- 确认当前运行在支持Blowfish哈希的类Unix环境中
- 调整盐格式,去掉末尾多余的
$,示例合法盐为$2y$04$aaaabbbbccccddddeeee - 修正后重新运行代码即可返回正确的哈希值
方案2:使用跨平台的bcrypt库(兼容性更高)
如果需要跨平台运行,不要依赖系统原生的crypt模块,直接使用独立维护的bcrypt库:
- 安装依赖:
pip install bcrypt - 加密示例代码:
import bcrypt # 待加密密码需要转为bytes类型 password = "123456".encode("utf-8") # 自动生成符合$2y$格式的盐,rounds对应cost参数 salt = bcrypt.gensalt(rounds=4, prefix=b"2y") # 生成哈希值 c_word = bcrypt.hashpw(password, salt)
- 密码验证示例代码:
# 验证时直接传入原始密码bytes和已生成的哈希值即可 is_valid = bcrypt.checkpw(password, c_word)
内容的提问来源于stack exchange,提问作者Aspis
相关产品推荐
相关产品推荐

