Spring security加密方式(转)
Acegi 对于密码提供三种方式:明文及不采用任何加密方式、MD5加密方式、哈希算法加密方式。
只需要在DAO的认证管理器中分别加入以下对应配置:
第一种:不使用任何加密方式的配置
Java代码
- <bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> ??????<property?name="userDetailsService"?ref="userDetailsService"?/> ????????<!--?明文加密,不使用任何加密算法,?在不指定该配置的情况下,Acegi默认采用的就是明文加密?--> ??????<!-- ??????<property?name="passwordEncoder"> ??????????<bean?class="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder">?? ??????????????????<property?name="ignorePasswordCase"?value="true"></property>?? ??????????</bean> ??????</property> ??????--> ??</bean>??
第二种:MD5方式加密
Java代码
- <bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> ??????<property?name="userDetailsService"?ref="userDetailsService"?/> ????????<property?name="passwordEncoder"> ??????????<bean?class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"> ??????????????<!--?false?表示:生成32位的Hex版,?这也是encodeHashAsBase64的,?Acegi?默认配置;?true??表示:生成24位的Base64版?--> ??????????????<property?name="encodeHashAsBase64"?value="false"?/> ??????????</bean> ??????</property> ??</bean>??
第三种:使用MD5加密,并添加全局加密盐
Java代码
- <bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> ??????<property?name="userDetailsService"?ref="userDetailsService"?/> ????????<property?name="passwordEncoder"> ??????????<bean?class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"> ??????????????<property?name="encodeHashAsBase64"?value="false"?/> ??????????</bean> ??????</property> ????????<!--?对密码加密算法中使用特定的加密盐及种子?--> ??????<property?name="saltSource"> ??????????<bean?class="org.acegisecurity.providers.dao.salt.SystemWideSaltSource"> ??????????????<property?name="systemWideSalt"?value="acegisalt"?/> ??????????</bean> ??????</property> ??</bean>??
第四种:使用MD5加密,并添加动态加密盐
Java代码
- <bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> ??????<property?name="userDetailsService"?ref="userDetailsService"?/> ????????<property?name="passwordEncoder"> ??????????<bean?class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"> ??????????????<property?name="encodeHashAsBase64"?value="false"?/> ??????????</bean> ??????</property> ????????<!--?对密码加密算法中使用特定的加密盐及种子?--> ??????<property?name="saltSource"> ??????????<!--?通过动态的加密盐进行加密,该配置通过用户名提供加密盐,?通过UserDetails的getUsername()方式?--> ???????????<bean?class="org.acegisecurity.providers.dao.salt.ReflectionSaltSource"> ??????????????<property?name="userPropertyToUse"?value="getUsername"?/> ???????????</bean> ??????</property> ??</bean>??
第五种:使用哈希算法加密,加密强度为256
Java代码
- <bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> ??????<property?name="userDetailsService"?ref="userDetailsService"?/> ????????<property?name="passwordEncoder"> ??????????<bean?class="org.acegisecurity.providers.encoding.ShaPasswordEncoder"> ??????????????<constructor-arg?value="256"?/> ??????????????<property?name="encodeHashAsBase64"?value="false"?/> ??????????</bean> ??????</property> ??</bean>??
Java代码
- <bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> ??????<property?name="userDetailsService"?ref="userDetailsService"?/> ????????<property?name="passwordEncoder"> ??????????<bean?class="org.acegisecurity.providers.encoding.ShaPasswordEncoder"> ??????????????<constructor-arg?value="SHA-256"?/> ??????????????<property?name="encodeHashAsBase64"?value="false"?/> ??????????</bean> ??????</property> ??</bean>??
Java代码
- package?com.brofe.acegi; ????import?org.acegisecurity.providers.encoding.Md5PasswordEncoder; ??import?org.acegisecurity.providers.encoding.ShaPasswordEncoder; ??????public?class?TestPasswordEncoder?{ ????????public?static?void?main(String[]?args)?throws?Exception?{ ?????????? ??????????md5();?//?使用简单的MD5加密方式??????????? ??????????sha_256();?//?使用256的哈希算法(SHA)加密??????????? ??????????sha_SHA_256();?//?使用SHA-256的哈希算法(SHA)加密??????????? ??????????md5_SystemWideSaltSource();?//?使用MD5再加全局加密盐加密的方式加密????????} ??????????????public?static?void?md5()?{ ??????????Md5PasswordEncoder?md5?=?new?Md5PasswordEncoder(); ??????????//?false?表示:生成32位的Hex版,?这也是encodeHashAsBase64的,?Acegi?默认配置;?true??表示:生成24位的Base64版???????????md5.setEncodeHashAsBase64(false); ??????????String?pwd?=?md5.encodePassword("123",?null); ??????????System.out.println("MD5:?"?+?pwd?+?"?len="?+?pwd.length()); ??????} ??????????????public?static?void?sha_256()?{ ??????????ShaPasswordEncoder?sha?=?new?ShaPasswordEncoder(256); ??????????sha.setEncodeHashAsBase64(false); ??????????String?pwd?=?sha.encodePassword("123",?null); ??????????System.out.println("哈希算法?256:?"?+?pwd?+?"?len="?+?pwd.length()); ??????} ?????? ????????????public?static?void?sha_SHA_256()?{ ??????????ShaPasswordEncoder?sha?=?new?ShaPasswordEncoder(); ??????????sha.setEncodeHashAsBase64(false); ??????????String?pwd?=?sha.encodePassword("123",?null);? ??????????System.out.println("哈希算法?SHA-256:?"?+?pwd?+?"?len="?+?pwd.length()); ??????} ?????? ????????????public?static?void?md5_SystemWideSaltSource?()?{ ??????????Md5PasswordEncoder?md5?=?new?Md5PasswordEncoder(); ??????????md5.setEncodeHashAsBase64(false); ?????????? ??????????//?使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可???????????String?pwd?=?md5.encodePassword("123",?"acegisalt"); ??????????System.out.println("MD5?SystemWideSaltSource:?"?+?pwd?+?"?len="?+?pwd.length()); ??????} ??} ?