博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Security 3.1 中功能强大的加密工具 PasswordEncoder
阅读量:6554 次
发布时间:2019-06-24

本文共 1810 字,大约阅读时间需要 6 分钟。

hot3.png

好吧,这种加密机制很复杂,还是看下图比较好了解:

 3.1.0版本中新的PasswordEncoder继承关系 

    

而在Spring-Security 3.1.0 版本之后,Spring-security-crypto模块中的password包提供了更给力的加密密码的支持,这个包中也有PasswordEncoder接口,接口定义如下。 

Java代码   
  1. Public interface PasswordEncoder{  
  2.   String encode(String rawPassword);  
  3.   Boolean matches(String rawPassword,String encodedPassword);  
  4. }  

 定义了两个方法,encode方法是对方法加密,而match方法是用来验证密码和加密后密码是否一致的,如果一致则返回true。和authentication.encoding包中的PasswordEncoder接口相比,简化了许多。 

   位于org.springframeword.security.crypto.password包中的 

StandardPasswordEncoder类,是PasswordEncoder接口的(唯一)一个实现类,是本文所述加密方法的核心。它采用SHA-256算法,迭代1024次,使用一个密钥(site-wide secret)以及8位随机盐对原密码进行加密。 

   随机盐确保相同的密码使用多次时,产生的哈希都不同; 密钥应该与密码区别开来存放,加密时使用一个密钥即可;对hash算法迭代执行1024次增强了安全性,使暴力破解变得更困难些。 

   和上一个版本的PasswordEncoder比较,好处显而易见:盐值不用用户提供,每次随机生成;多重加密————迭代SHA算法+密钥+随机盐来对密码加密,大大增加密码破解难度。 

OK,了解了原理我们可以来测试一下:

Java代码   
  1. import org.springframework.security.crypto.password.PasswordEncoder;  
  2. import org.springframework.security.crypto.password.StandardPasswordEncoder;  
  3.   
  4. /** 
  5.  * @author XUYI 
  6.  * Spring Security 3.1 PasswordEncoder 
  7.  */  
  8. public class EncryptUtil {  
  9.     //从配置文件中获得  
  10.     private static final String SITE_WIDE_SECRET = "my-secret-key";  
  11.     private static final PasswordEncoder encoder = new StandardPasswordEncoder(  
  12.        SITE_WIDE_SECRET);  
  13.    
  14.     public static String encrypt(String rawPassword) {  
  15.          return encoder.encode(rawPassword);  
  16.     }  
  17.    
  18.     public static boolean match(String rawPassword, String password) {  
  19.          return encoder.matches(rawPassword, password);  
  20.     }  
  21.       
  22.     public static void main(String[] args) {  
  23.         System.out.println(EncryptUtil.encrypt("每次结果都不一样伐?"));  
  24.         System.out.println(EncryptUtil.encrypt("每次结果都不一样伐?"));  
  25.         System.out.println(EncryptUtil.encrypt("每次结果都不一样伐?"));  
  26.         System.out.println(EncryptUtil.encrypt("每次结果都不一样伐?"));  
  27.         System.out.println(EncryptUtil.encrypt("每次结果都不一样伐?"));    
  28.         //但是把每次结果拿出来进行match,你会发现可以得到true。  
  29.     }  
  30.  }  
 

转载于:https://my.oschina.net/bigyuan/blog/352065

你可能感兴趣的文章
新生儿操作系统操作手册
查看>>
linux下如何安装charles
查看>>
正在载入数据中效果
查看>>
Js模型和封装
查看>>
第二章 Java浮点数精确计算
查看>>
apiCloud实现加载更多效果,基本完美~
查看>>
Redis基准
查看>>
如何使用openssl生成RSA公钥和私钥对
查看>>
当我们安装使用时,会出现eclipse启动不了,出现“Java was started but returned exit code=13......”的问题...
查看>>
2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
查看>>
简明 MongoDB 入门教程
查看>>
.NET Core 3.0中的数据库驱动框架System.Data
查看>>
北大AI公开课2019 | 雷鸣:人工智能革命与机遇
查看>>
英特尔开源计算机视觉数据标签工具CVAT,加速数据注释
查看>>
SQL Server内存泄漏
查看>>
NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障
查看>>
用Windows Live Writer发布日志到BlogBus
查看>>
解决公司服务器加入域中不能启动应用系统的问题
查看>>
解压缩 操作
查看>>
rsyslog收集nginx日志配置
查看>>