Acegi 对于密码提供三种方式:明文及不采用任何加密方式、MD5加密方式、哈希算法加密方式。
只需要在DAO的认证管理器中分别加入以下对应配置:
第一种:不使用任何加密方式的配置
-
<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方式加密
-
<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加密,并添加全局加密盐
-
<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加密,并添加动态加密盐
-
<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
-
<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>
第六种:使用哈希算法加密,加密强度为SHA-256
-
<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>
上述配置只是在Acegi通过表单提交的用户认证信息中的密码做各种加密操作。而我们存储用户密码的时候,可以通过一下程序完成用户密码操作:
-
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()); - }
- }
版权声明:本文为sunyedong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。