spring提供的几种密码加密方式

  • Post author:
  • Post category:其他





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




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






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




  1. <


    bean




    id


    =


    “daoAuthenticationProvider”





  2. class


    =


    “org.acegisecurity.providers.dao.DaoAuthenticationProvider”


    >





  3. <


    property




    name


    =


    “userDetailsService”




    ref


    =


    “userDetailsService”




    />






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




  5. <!–

    <


    property




    name


    =


    “passwordEncoder”


    >




    <


    bean




    class


    =


    “org.acegisecurity.providers.encoding.PlaintextPasswordEncoder”


    >





  6. <


    property




    name


    =


    “ignorePasswordCase”




    value


    =


    “true”


    >


    </


    property


    >




    </


    bean


    >




    </


    property


    >





    >





  7. </


    bean


    >






第二种:MD5方式加密






  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加密,并添加动态加密盐




  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



  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




  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通过表单提交的用户认证信息中的密码做各种加密操作。而我们存储用户密码的时候,可以通过一下程序完成用户密码操作:






  1. package


    org.hz.test;




  2. import


    java.security.NoSuchAlgorithmException;




  3. import


    org.springframework.security.authentication.encoding.Md5PasswordEncoder;



  4. import


    org.springframework.security.authentication.encoding.ShaPasswordEncoder;




  5. public




    class


    MD5Test {



  6. public




    static




    void


    md5() {


  7. Md5PasswordEncoder md5 =

    new


    Md5PasswordEncoder();



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




  9. md5.setEncodeHashAsBase64(

    false


    );


  10. String pwd = md5.encodePassword(

    “1234”


    ,


    null


    );


  11. System.out.println(

    “MD5: ”


    + pwd +


    ” len=”


    + pwd.length());


  12. }


  13. public




    static




    void


    sha_256()


    throws


    NoSuchAlgorithmException {


  14. ShaPasswordEncoder sha =

    new


    ShaPasswordEncoder(


    256


    );


  15. sha.setEncodeHashAsBase64(

    true


    );


  16. String pwd = sha.encodePassword(

    “1234”


    ,


    null


    );


  17. System.out.println(

    “哈希算法 256: ”


    + pwd +


    ” len=”


    + pwd.length());


  18. }




  19. public




    static




    void


    sha_SHA_256() {


  20. ShaPasswordEncoder sha =

    new


    ShaPasswordEncoder();


  21. sha.setEncodeHashAsBase64(

    false


    );


  22. String pwd = sha.encodePassword(

    “1234”


    ,


    null


    );


  23. System.out.println(

    “哈希算法 SHA-256: ”


    + pwd +


    ” len=”


    + pwd.length());


  24. }




  25. public




    static




    void


    md5_SystemWideSaltSource () {


  26. Md5PasswordEncoder md5 =

    new


    Md5PasswordEncoder();


  27. md5.setEncodeHashAsBase64(

    false


    );




  28. // 使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可




  29. String pwd = md5.encodePassword(

    “1234”


    ,


    “acegisalt”


    );


  30. System.out.println(

    “MD5 SystemWideSaltSource: ”


    + pwd +


    ” len=”


    + pwd.length());


  31. }


  32. public




    static




    void


    main(String[] args)


    throws


    NoSuchAlgorithmException {


  33. md5();

    // 使用简单的MD5加密方式





  34. sha_256();

    // 使用256的哈希算法(SHA)加密





  35. sha_SHA_256();

    // 使用SHA-256的哈希算法(SHA)加密





  36. md5_SystemWideSaltSource();

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




  37. }


  38. }