java - 使用 python passlib 兼容 Spring 的 scrypt 密码
问题描述
如何从 python 生成与 Spring 兼容的密码?
我有一个 spring 应用程序在数据库中创建 scrypt 密码,如下所示:
{scrypt}$e0801$QAqC0fvhY6iJPysiQsFnrcUg205njHo/6o+IDXDn33lxmZOCVBhb4NAqdafhuGmykCxQtMI5xP5zb7MYMUrU3Q==$sBeXCHOm6zQuGdSDKs+HeXnNQGg3bhRidmL+HU/ZTMM=
我正在尝试使用 python 和 passlib 直接使用新密码更新数据库,但无法从以下位置预测 passlib 的正确 setting_kwds $e0801$
:
>>> from passlib.hash import scrypt
>>> scrypt.verify('wBkfoBsxj9u3wLOZ', '{scrypt}$e0801$QAqC0fvhY6iJPysiQsFnrcUg205njHo/6o+IDXDn33lxmZOCVBhb4NAqdafhuGmykCxQtMI5xP5zb7MYMUrU3Q==$sBeXCHOm6zQuGdSDKs+HeXnNQGg3bhRidmL+HU/ZTMM=')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/gregn/.pyenv/versions/v2.7.16/lib/python2.7/site-packages/passlib/utils/handlers.py", line 789, in verify
self = cls.from_string(hash, **context)
File "/home/gregn/.pyenv/versions/v2.7.16/lib/python2.7/site-packages/passlib/handlers/scrypt.py", line 177, in from_string
return cls(**cls.parse(hash))
File "/home/gregn/.pyenv/versions/v2.7.16/lib/python2.7/site-packages/passlib/handlers/scrypt.py", line 181, in parse
ident, suffix = cls._parse_ident(hash)
File "/home/gregn/.pyenv/versions/v2.7.16/lib/python2.7/site-packages/passlib/utils/handlers.py", line 1207, in _parse_ident
raise exc.InvalidHashError(cls)
ValueError: not a valid scrypt hash
手动摆弄前缀格式没有奏效:
>>> scrypt.verify('wBkfoBsxj9u3wLOZ', '$scrypt$ln=1,r=8,p=1$QAqC0fvhY6iJPysiQsFnrcUg205njHo/6o+IDXDn33lxmZOCVBhb4NAqdafhuGmykCxQtMI5xP5zb7MYMUrU3Q==$sBeXCHOm6zQuGdSDKs+HeXnNQGg3bhRidmL+HU/ZTMM=')
False
我认为(但不确定)Spring 正在使用默认的 SCryptPasswordEncoder 设置,因为我发现:
public static PasswordEncoder getPasswordEncoder() {
final String encodingId = "scrypt";
final Map<String, PasswordEncoder> encoders = new HashMap<>();
encoders.put("bcrypt", new BCryptPasswordEncoder());
encoders.put(encodingId, new SCryptPasswordEncoder());
return new DelegatingPasswordEncoder(encodingId, encoders);
}
春季版:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.18.RELEASE)
谢谢!
解决方案
您提供的不是有效的 scrypt 哈希
{scrypt}$e0801$QAqC0fvhY....
这是正确的格式(只需替换{scrypt}
为$s0
)
$s0$e0801$QAqC0fvhY6iJPysiQsFnrcUg205njHo/6o+IDXDn33lxmZOCVBhb4NAqdafhuGmykCxQtMI5xP5zb7MYMUrU3Q==$sBeXCHOm6zQuGdSDKs+HeXnNQGg3bhRidmL+HU/ZTMM=
如果您尝试使用Password4j获取配置:
SCryptFunction.getInstanceFromHash("$s0$e0801$QAqC0...");
你得到N=16384
和。在您的 Python 实现中使用此配置。r=8
p=1
推荐阅读
- c - ftell 如何影响以 'r' 而不是 'rb' 模式读取的二进制文件?
- python - 获取与 DOM 元素关联的事件列表
- php - 如何为 wordpress 制作 OG 图片
- mysql - 多个或查询中的顺序会影响相关性吗?
- haskell - 在构建中包含美味快速检查的问题
- reactjs - 垂直对齐 div 元素
- delphi - Delphi 10.3 中带有预览的文件打开对话框
- spring-boot - 添加执行器的依赖项后,Spring Boot 无法正常工作
- docker - 为 centos 8 容器设置 php-fpm
- flutter - 在 POST 请求后更新显示的数据