3. 多加密方案(自学、了解)
Spring Security 在加密功能上比 Shiro『高级』一点的是,它在一个系统中支持存在多种加密方式。<small>尽管我们不一定会用到这个『高级』特性。</small>
简单来说,在 Shiro 中,一旦确定使用何种加密方式(算法),使用该系统的用户一定都是用同一种加密算法对密码进行加密,即,张三和李四<small>(在注册时)</small>都是使用 xxx 算法对各自的密码进行加密<small>(而后存储至数据库)</small>。
而 Spring Security 则可以实现这样的功能:张三<small>(在注册时)</small>使用的是 xxx 算法对自己的密码进行加密<small>(然后存储至数据库)</small>,而李四<small>(在注册时)</small>使用的是 yyy 算法对自己的密码进行加密<small>(而后存储至数据库)</small>。
Spring Security 之所以能实现这样的功能是因为,无论你是使用的何种加密算法,在加密后的密码的前面 Spring Security『拼』上了加密算法信息。形如:
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
{noop}password
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
这样,在<small>(未来进行登录)</small>比对时,Spring Security『看见』这些密码时,就能知道『当初』注册时它们是使用何种密码加密的,进而再从 Spring IoC 容器中去取对应的 Password Encoder 来对用户输入密码进行同样的加密后,再比对。
为了方便我们的操作,Spring Security 提供了一个名为 PasswordEncoderFactories 的工具类来便于我们使用各种 PasswordEncoder 。
PasswordEncoderFactories 的 createDelegatingPasswordEncoder 方法会返回一个 DelegatingPasswordEncoder ,故名思意,DelegatingPasswordEncoder 会代理所有的 Spring Security PasswordEncoder 加密器。
当你使用 DelegatingPasswordEncoder 进行密码加密时,它会要求你传入一个加密算法的名字,它再『帮你』调用那个 PasswordEncoder 对你的密码进行加密后,并且它会在加密密码的前面再拼接上对应的名字。
网友评论