Spring Security 中提供了 BCryptPasswordEncoder 用于用户密码的加密和验证,这里讲解一下该 PasswordEncoder 的实现逻辑.
首先 BCryptPasswordEncoder 使用了 BCrypt 算法来对密码实现加密和验证。由于 BCrypt 本身是一种 单向Hash算法,因此它和我们日常用的 MD5一样,通常情况下是无法逆向解密的。
在 BSD系统中 BCrypt 算法主要用来替代 md5 加密算法,它使用了一种可变版本的Blowfish流密码算法。通过多次加盐和随机数,因此这套加密算法被广泛用于许多系统的密码加密当中。目前来看该加密算法没有已知的漏洞。在新应用中BCrypt 加密算法是推荐的四种密码散列算法之一.
流密码加密
相较于 分组加密方案和消息填充算法,流密码加密算法方案本身就可以加密任意长度的数据,无需密码分组和消息填充。
加密参数
在 BCryptPasswordEncoder 加密过程中,会提供主要参数来辅助加密:
-
salt :可选的加盐字符串,如果未指定,则会自动生成一个加盐字符.取值范围为 [./0-9A-Za-z] -
rounds 一个可选的随机数,默认为 12 ,取值范围为 4 到 31 之间,左闭右闭. -
version 用于指定一个 BCrypt 算法版本,如果未指定,则默认为 2b ,可选版本有:
2 ,BCrypt 的第一个版本,由于存在一个小的安全缺陷,目前已不再使用2a 在一些实现中存在罕见的安全缺陷,被 2b 版本取代2y 使用 crypt_blowfish BCrypt 算法实现格式化,除了名称外与 2b 无明显区别2b 官方最新的 BCrypt 算法版本,目前为默认版本
参考资料
passlib.hash.bcrypt - BCrypt
Spring Security中的BCryptPasswordEncoder
对称密钥加密算法
Class BCrypt
More Secure Passwords in Bcrypt — Beating the 72 Bytes Limitation
|