Spring Security加密策略

  • Post author:
  • Post category:其他


Acegi 对于密码提供三种方式:明文及不采用任何加密方式、MD5加密方式、哈希算法加密方式。

只需要在DAO的认证管理器中分别加入以下对应配置:


第一种:不使用任何加密方式的配置

Java代码

  1. <bean id=

    “daoAuthenticationProvider”



    class


    =

    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”

    >
  2. <property name=

    “userDetailsService”

    ref=

    “userDetailsService”

    />
  3. <!– 明文加密,不使用任何加密算法, 在不指定该配置的情况下,Acegi默认采用的就是明文加密 –>
  4. <!–
  5. <property name=

    “passwordEncoder”

    >
  6. <bean


    class


    =

    “org.acegisecurity.providers.encoding.PlaintextPasswordEncoder”

    >
  7. <property name=

    “ignorePasswordCase”

    value=

    “true”

    ></property>
  8. </bean>
  9. </property>
  10. –>
  11. </bean>


第二种:MD5方式加密

Java代码

  1. <bean id=

    “daoAuthenticationProvider”



    class


    =

    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”

    >
  2. <property name=

    “userDetailsService”

    ref=

    “userDetailsService”

    />
  3. <property name=

    “passwordEncoder”

    >
  4. <bean


    class


    =

    “org.acegisecurity.providers.encoding.Md5PasswordEncoder”

    >
  5. <!–


    false


    表示:生成

    32

    位的Hex版, 这也是encodeHashAsBase64的, Acegi 默认配置;


    true


    表示:生成

    24

    位的Base64版 –>
  6. <property name=

    “encodeHashAsBase64”

    value=

    “false”

    />
  7. </bean>
  8. </property>
  9. </bean>


第三种:使用MD5加密,并添加全局加密盐

Java代码

  1. <bean id=

    “daoAuthenticationProvider”



    class


    =

    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”

    >
  2. <property name=

    “userDetailsService”

    ref=

    “userDetailsService”

    />
  3. <property name=

    “passwordEncoder”

    >
  4. <bean


    class


    =

    “org.acegisecurity.providers.encoding.Md5PasswordEncoder”

    >
  5. <property name=

    “encodeHashAsBase64”

    value=

    “false”

    />
  6. </bean>
  7. </property>
  8. <!– 对密码加密算法中使用特定的加密盐及种子 –>
  9. <property name=

    “saltSource”

    >
  10. <bean


    class


    =

    “org.acegisecurity.providers.dao.salt.SystemWideSaltSource”

    >
  11. <property name=

    “systemWideSalt”

    value=

    “acegisalt”

    />
  12. </bean>
  13. </property>
  14. </bean>


第四种:使用MD5加密,并添加动态加密盐

Java代码

  1. <bean id=

    “daoAuthenticationProvider”



    class


    =

    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”

    >
  2. <property name=

    “userDetailsService”

    ref=

    “userDetailsService”

    />
  3. <property name=

    “passwordEncoder”

    >
  4. <bean


    class


    =

    “org.acegisecurity.providers.encoding.Md5PasswordEncoder”

    >
  5. <property name=

    “encodeHashAsBase64”

    value=

    “false”

    />
  6. </bean>
  7. </property>
  8. <!– 对密码加密算法中使用特定的加密盐及种子 –>
  9. <property name=

    “saltSource”

    >
  10. <!– 通过动态的加密盐进行加密,该配置通过用户名提供加密盐, 通过UserDetails的getUsername()方式 –>
  11. <bean


    class


    =

    “org.acegisecurity.providers.dao.salt.ReflectionSaltSource”

    >
  12. <property name=

    “userPropertyToUse”

    value=

    “getUsername”

    />
  13. </bean>
  14. </property>
  15. </bean>


第五种:使用哈希算法加密,加密强度为256

Java代码

  1. <bean id=

    “daoAuthenticationProvider”



    class


    =

    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”

    >
  2. <property name=

    “userDetailsService”

    ref=

    “userDetailsService”

    />
  3. <property name=

    “passwordEncoder”

    >
  4. <bean


    class


    =

    “org.acegisecurity.providers.encoding.ShaPasswordEncoder”

    >
  5. <constructor-arg value=

    “256”

    />
  6. <property name=

    “encodeHashAsBase64”

    value=

    “false”

    />
  7. </bean>
  8. </property>
  9. </bean>


第六种:使用哈希算法加密,加密强度为SHA-256

Java代码

  1. <bean id=

    “daoAuthenticationProvider”



    class


    =

    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”

    >
  2. <property name=

    “userDetailsService”

    ref=

    “userDetailsService”

    />
  3. <property name=

    “passwordEncoder”

    >
  4. <bean


    class


    =

    “org.acegisecurity.providers.encoding.ShaPasswordEncoder”

    >
  5. <constructor-arg value=

    “SHA-256”

    />
  6. <property name=

    “encodeHashAsBase64”

    value=

    “false”

    />
  7. </bean>
  8. </property>
  9. </bean>


上述配置只是在Acegi通过表单提交的用户认证信息中的密码做各种加密操作。而我们存储用户密码的时候,可以通过一下程序完成用户密码操作:

Java代码



  1. package


    com.brofe.acegi;


  2. import


    org.acegisecurity.providers.encoding.Md5PasswordEncoder;


  3. import


    org.acegisecurity.providers.encoding.ShaPasswordEncoder;


  4. public




    class


    TestPasswordEncoder {


  5. public




    static




    void


    main(String[] args)


    throws


    Exception {
  6. md5();

    // 使用简单的MD5加密方式
  7. sha_256();

    // 使用256的哈希算法(SHA)加密
  8. sha_SHA_256();

    // 使用SHA-256的哈希算法(SHA)加密
  9. md5_SystemWideSaltSource();

    // 使用MD5再加全局加密盐加密的方式加密
  10. }


  11. public




    static




    void


    md5() {
  12. Md5PasswordEncoder md5 =


    new


    Md5PasswordEncoder();

  13. // false 表示:生成32位的Hex版, 这也是encodeHashAsBase64的, Acegi 默认配置; true  表示:生成24位的Base64版
  14. md5.setEncodeHashAsBase64(


    false


    );
  15. String pwd = md5.encodePassword(

    “123”

    ,


    null


    );
  16. System.out.println(

    “MD5: ”

    + pwd +

    ” len=”

    + pwd.length());
  17. }


  18. public




    static




    void


    sha_256() {
  19. ShaPasswordEncoder sha =


    new


    ShaPasswordEncoder(

    256

    );
  20. sha.setEncodeHashAsBase64(


    false


    );
  21. String pwd = sha.encodePassword(

    “123”

    ,


    null


    );
  22. System.out.println(

    “哈希算法 256: ”

    + pwd +

    ” len=”

    + pwd.length());
  23. }


  24. public




    static




    void


    sha_SHA_256() {
  25. ShaPasswordEncoder sha =


    new


    ShaPasswordEncoder();
  26. sha.setEncodeHashAsBase64(


    false


    );
  27. String pwd = sha.encodePassword(

    “123”

    ,


    null


    );
  28. System.out.println(

    “哈希算法 SHA-256: ”

    + pwd +

    ” len=”

    + pwd.length());
  29. }


  30. public




    static




    void


    md5_SystemWideSaltSource () {
  31. Md5PasswordEncoder md5 =


    new


    Md5PasswordEncoder();
  32. md5.setEncodeHashAsBase64(


    false


    );

  33. // 使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可
  34. String pwd = md5.encodePassword(

    “123”

    ,

    “acegisalt”

    );
  35. System.out.println(

    “MD5 SystemWideSaltSource: ”

    + pwd +

    ” len=”

    + pwd.length());
  36. }
  37. }



版权声明:本文为sunyedong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。