如何将Passlib的pbkdf2-sha512哈希盐与摘要转换为PHC Base64格式
将Passlib的pbkdf2-sha512哈希转换为Auth0兼容的PHC格式
核心转换逻辑
Passlib的适配Base64与标准Base64的差异仅在于字符映射:
- Passlib用
.替代标准Base64的+ - Passlib用
_替代标准Base64的/
转换时需先修正字符映射,再处理填充(按需移除),最终得到Auth0要求的无填充标准Base64格式。
具体转换步骤(以你的示例哈希为例)
你的Passlib哈希:
$pbkdf2-sha512$25000$8d7bW2stZaw1BoBQyhkjZA$Dszct0GGjjfikK3cJhx.4M.YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY.855KWRsGoPudA0HA
提取关键参数
- 轮数:25000
- Passlib格式盐:
8d7bW2stZaw1BoBQyhkjZA - Passlib格式哈希:
Dszct0GGjjfikK3cJhx.4M.YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY.855KWRsGoPudA0HA
转换盐为标准无填充Base64
该盐无Passlib特殊字符,且长度为24(4的倍数),无需调整,直接使用原字符串即可:8d7bW2stZaw1BoBQyhkjZA转换哈希为标准无填充Base64
- 替换特殊字符:将哈希中的
.全部替换为+,得到:Dszct0GGjjfikK3cJhx+4M+YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY+855KWRsGoPudA0HA - 验证长度:替换后长度为86,需补2个
=填充为标准Base64,再移除填充符,最终结果与替换后的字符串一致(因为移除填充不影响解码)
- 替换特殊字符:将哈希中的
组装PHC格式字符串
按照Auth0要求的PHC规范,最终结果为:$pbkdf2-sha512$i=25000$8d7bW2stZaw1BoBQyhkjZA$Dszct0GGjjfikK3cJhx+4M+YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY+855KWRsGoPudA0HA
自动化转换脚本
以下Python脚本可批量处理Passlib格式的pbkdf2-sha512哈希:
import base64 def passlib_to_phc(passlib_hash): # 拆分Passlib哈希结构 parts = passlib_hash.split('$') if len(parts) != 5 or parts[1] != 'pbkdf2-sha512': raise ValueError("无效的Passlib pbkdf2-sha512哈希格式") rounds = parts[2] passlib_salt = parts[3] passlib_digest = parts[4] # 适配Base64转标准无填充Base64 def adapt_to_std_b64(s): # 替换Passlib特殊字符 s = s.replace('.', '+').replace('_', '/') # 补充填充符以符合标准Base64格式 padding = (4 - len(s) % 4) % 4 s += '=' * padding # 解码后重新编码为无填充标准Base64 decoded = base64.b64decode(s) return base64.b64encode(decoded).decode().rstrip('=') std_salt = adapt_to_std_b64(passlib_salt) std_digest = adapt_to_std_b64(passlib_digest) # 组装PHC格式字符串 return f"$pbkdf2-sha512$i={rounds}${std_salt}${std_digest}" # 测试示例哈希 test_hash = "$pbkdf2-sha512$25000$8d7bW2stZaw1BoBQyhkjZA$Dszct0GGjjfikK3cJhx.4M.YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY.855KWRsGoPudA0HA" print("Auth0兼容PHC哈希:") print(passlib_to_phc(test_hash))
运行后输出:
Auth0兼容PHC哈希: $pbkdf2-sha512$i=25000$8d7bW2stZaw1BoBQyhkjZA$Dszct0GGjjfikK3cJhx+4M+YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY+855KWRsGoPudA0HA
验证转换正确性
可通过以下代码验证转换后的哈希能否正确匹配原密码:
from passlib.context import CryptContext pwd_context = CryptContext(schemes=["pbkdf2-sha512"]) phc_hash = "$pbkdf2-sha512$i=25000$8d7bW2stZaw1BoBQyhkjZA$Dszct0GGjjfikK3cJhx+4M+YdOoytY9T5qaib9y8C/gvC1rE4iCWT970bN/MJD81RVToY+855KWRsGoPudA0HA" print(pwd_context.verify("Password!", phc_hash)) # 输出True则转换正确
内容的提问来源于stack exchange,提问作者R2Bleep2
相关产品推荐
相关产品推荐

