Spring Security 3.1 中功能强大的加密工具 PasswordEncoder

转载 2016年08月29日 18:40:58
  去年发生的密码泄漏事件,我们也对密码加密做了重新研究。 
  
  在筛选加密方法的过程中,发现了Spring Security 3.1.0版本中提供了新的PasswordEncoder,它的加密方法非常给力!虽然ns同学曾经说过“你的网站看起来很安全, 只是因为人家没精力或者没兴趣搞你...”,但是找到一个好的加密方法,无疑还是会有很大帮助的,至少会延迟破解的时间  

  说到PasswordEncoder,使用过Spring Security的人应该不会陌生。在3.1.0版本之前,位于org.springframework.security.authentication.encoding包中,辅以一系列的实现类,每个实现类使用了不同的加密方法,有Md4PasswordEncoder、Md5PasswordEncoder、ShaPasswordEncoder、PlaintextPasswordEncoder等。加密方法采用hash+salt方式。 

   3.0.0版本中PasswordEncoder继承关系 

   在3.1.0及之后的版本,增加了crypto包/模块,提供了更加强大的对称加密,生成key,以及密码加密功能。这个模块是作为core的一部分存在的,但是对其它任何Spring Security或Spring代码没有依赖,也可以单独作为一个包存在! 
   3.1.0版本中新的PasswordEncoder继承关系 

   在3.1.0以前的版本中,PasswordEncoder位于 
org.springframeword.security.authentication.encoding包中,接口定义如下: 
Java代码  收藏代码
  1. public interface PasswordEncoder{  
  2.    String encodePassword(String rawPass,Object salt);  
  3.    Boolean isPasswordValid(String encPass,String rawPass,Object salt);  
  4. }  
   接口中定义了两个方法,encodePassword()方法是对原始密码进行加密,采用hash+salt方式,在方法中得提供盐值(salt)。 
   isPasswordValid方法是用来验证密码是否正确的,得提供三个参数,原始密码,加密后的密码以及盐值(salt)。 

   在具体加密过程中,可以动态选择各种实现类(其实就是各种加密算法),配合salt来进行加密和验证工作。 

   缺点就是每次加密和解密都得提供盐值,那么有两种方式,一是将盐值和密码存在一起,一是使用固定的盐值。盐值和密码存在一起也不是一个好的方案,如果数据库被盗,有了密码和盐值,暴力破解会容易一些;而固定的盐值也不是一个很好的方案。 

   Spring小组意识到了之前的PasswordEncoder的缺点,于是在3.1.0中推出了新的、更给力的PasswordEncoder,为了向前兼容,不能废掉PasswordEncoder,于是在另一个包中重新定义了一个PasswordEncoder接口。不过个人愚见,应该在org.springframeword.security.authentication.encoding.PasswordEncoder接口上增加@Deprecated 

   而在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算法+密钥+随机盐来对密码加密,大大增加密码破解难度。 

   简单封装一下: 
  
Java代码  收藏代码
  1. public class EncryptUtil {  
  2.    //从配置文件中获得  
  3.    private static final String SITE_WIDE_SECRET = "beibei";  
  4.    private static final PasswordEncoder encoder = new StandardPasswordEncoder(  
  5.       SITE_WIDE_SECRET);  
  6.   
  7.    public static String encrypt(String rawPassword) {  
  8.         return encoder.encode(rawPassword);  
  9.    }  
  10.   
  11.    public static boolean match(String rawPassword, String password) {  
  12.         return encoder.matches(rawPassword, password);  
  13.    }  
  14. }  
Java代
   从配置文件中获得密钥(SITE_WIDE_SECRET),使用static的PasswordEncoder,保证只用一个实例来加密与 
匹配。 
   加密后得到的密码是80位,霸气十足。 

Java代码  收藏代码
  1.        public static void main(String[] args) {  
  2.     System.out.println(EncryptUtil.encrypt("test"));  
  3.     System.out.println(EncryptUtil.encrypt("test"));  
  4.                System.out.println(EncryptUtil.encrypt("test"));  
  5. }  
  6.     

引用

        b84e62f1d332154e1db9da86c1ec30ee86c43f0307fd1c4b06873167eb08ca674bbf72cfe2a99b5d 
        05b78338cb2c275e471533b05eff31979f5e4df9695ab72eb55cfe3abd92a7d581f250fc9d37d801 
        aba3493a7cd4e646a1ea33b2a1b074b03899b5e76618bfea70542fa337e286cb2ac27bde4f4be903 

相关文章推荐

Spring Security 4 整合Hibernate Bcrypt密码加密(带源码)

【相关已翻译的本系列其他文章,点击分类里面的spring security 4】 【剩余文章,将尽快翻译完毕,敬请期待。 翻译by 明明如月 QQ 605283073】 原文地址:http://web...

Spring security3的MD5加密和StandardPasswordEncoder的配置详解

1、MD5加盐值进行加密处理 application-security.xml文件配置:

在spring security3中使用自定义的MD5和salt进行加密

首先看代码: 如果我们要自己控制密码权限的验证,可以在配置中使用来指定自己的密码验证类,该类继承自MessageDigestPassword...
  • zavens
  • zavens
  • 2013年12月06日 13:51
  • 13633

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Spring Security 中的盐值加密

在 Spring Security 文档中有这么一句话: "盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加...

Spring Security加密策略

Acegi 对于密码提供三种方式:明文及不采用任何加密方式、MD5加密方式、哈希算法加密方式。 只需要在DAO的认证管理器中分别加入以下对应配置: 第一种:不使用任何加密方式的配置 ...

使用BCryptPasswordEncoder管理密码

官方是推荐我们使用BCryptPasswordEncoder而PasswordEncoder 等已经被废弃了   1.看个简单的例子 @Test public void tes...

Spring Security 3.1 中功能强大的加密工具 PasswordEncoder

3.1.0版本中新的PasswordEncoder继承关系 而在Spring-Security 3.1.0 版本之后,Spring-security-crypto模块中的password包提供了更...

浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPas...
  • J_bean
  • J_bean
  • 2017年09月19日 16:28
  • 394

Spring3中好用的工具类收集

1) 请求工具类 org.springframework.web.bind.ServletRequestUtils//取请求参数的整数值:public static Integer getIntPar...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Security 3.1 中功能强大的加密工具 PasswordEncoder
举报原因:
原因补充:

(最多只允许输入30个字)