ballcat-projects/ballcat

PasswordEncoder 优化

Hccake opened this issue · 2 comments

用户密码修改时使用的加密方式不应该使用 PasswordUtils 中提供的默认 PasswordEncoder。

应该从容器中获取,以便保持和 auth 中的一致,也方便用户替换自己的 PasswordEncoder。

加密方式这里是否考虑通过SPI机制去实现是否会更好,内置默认加密方式,用户也可使用自己的加密方式

加密方式这里是否考虑通过SPI机制去实现是否会更好,内置默认加密方式,用户也可使用自己的加密方式

设计之初就提供了这样的机制,用户可以通过自定义 PasswordEncoder 实现密码加解密方式替换,目前主要是修改密码这里写死了,需要修改。

当前实现

目前登录时,会利用注册在 spring 容器中的密码编码器 PasswordEncoder 实例,进行密码的加密以及匹配:

ballcat 默认的 PasswordEncoder 使用的是 DelegatingPasswordEncoder(用户可以自己注册 PasswordEncoder 进行替换这一行为),使用该密码编码器加密时获得的密文格式为:{bcrypt}算法密文,进行密码匹配测试时使用的数据格式为:{加密算法}算法密文

目前支持以下加密算法,当加密算法部分为空时,默认使用 bcrypt 算法。

  • bcrypt
  • ldap
  • MD4
  • MD5
  • noop
  • pbkdf2
  • scrypt
  • SHA-1
  • SHA-256
  • sha256
  • sha256

示例

如明文密码:a123456
使用 MD5 加密后的的密文为 dc483e80a7a0bd9ef71d8cf973673924
使用 bcrypt 加密后的密文为 $2a$10$iBJZLHRVrjpJCKVNUZw6B.wbdClhvVdT91KbN25sTjbn1MJT4wqmm

那么,当使用 DelegatingPasswordEncoder 进行匹配时,以下几种数据都将返回 true:

  • $2a$10$iBJZLHRVrjpJCKVNUZw6B.wbdClhvVdT91KbN25sTjbn1MJT4wqmm
  • {bcrypt}$2a$10$iBJZLHRVrjpJCKVNUZw6B.wbdClhvVdT91KbN25sTjbn1MJT4wqmm
  • {MD5}dc483e80a7a0bd9ef71d8cf973673924
  • {noop}a123456

也就是说在 sys_user 表中的 password 字段,支持同时存在多种加密方式,方便密码加密算法的迁移