zoukankan      html  css  js  c++  java
  • MD5 几种方法的选择

    转:http://zoroeye.iteye.com/blog/2026984?utm_source=tuicool&utm_medium=referral

    md5加密实现方法有很多种,也导致很难选择。大概分析下自己了解的一些用法。 

    1.sun官方 
    sun提供了MessageDigest和BASE64Encoder可以用指定算法加密。 
    例: 

    Java代码  收藏代码
    1. public static final String EncoderPwdByMd5(String str) throws                    NoSuchAlgorithmException,UnsupportedEncodingException  
    2.     {  
    3.         // 确定计算方法  
    4.         MessageDigest md5 = MessageDigest.getInstance("MD5");  
    5.         BASE64Encoder base64en = new BASE64Encoder();  
    6.         // 加密后的字符串,注意一定要自己指定编码,否则会取系统默认。不同系统会不一致。  
    7.         String newstr = base64en.encode(md5.digest(str.getBytes("utf-8")));  
    8.         return newstr;  
    9.     }  



    分析: 
    1)BASE64Encoder是不建议使用的,引入有时候也会报错: 
    Access restriction: The type BASE64Encoder is not accessible due to restriction on required library C:Program filesjavajdk1.6jrelib t.jar 
    oracle官方有文档说明(Why Developers Should Not Write Programs That Call 'sun' Packages),sun.*下面的类不建议使用: 
    http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html 

    但也有两种规避办法。 
    方法一: 
    1. Open project properties. 
    2. Select Java Build Path node. 
    3. Select Libraries tab. 
    4. Remove JRE System Library. 
    5. Add Library JRE System Library. 

    方法二: 
    Go to Window-->Preferences-->Java-->Compiler-->Error/Warnings. 
    Select Deprecated and Restricted API. Change it to warning. 
    Change forbidden and Discouraged Reference and change it to warning. (or as your need.) 

    另外: 
    使用MessageDigest不使用BASE64Encoder也可以实现md5加密,但要自己实现md5算法, 
    比较麻烦。可以参考: 
    http://blog.csdn.net/xiao__gui/article/details/8148203http://blog.csdn.net/xiao__gui/article/details/8148203 
    http://wenku.baidu.com/link?url=pgf96g_dt2r2vEE88RG7jqMaW3PCSmxL_3sEBwbNb4EzLalQnb-hUsAB1bnqotbAlCDTT60WvFdS0hn9QTeSJAUtahDgpWE9Z_S-yM8Y6-a 

    2.sun官方和第三方结合 
    也可以使用MessageDigest 加第三方apache commons-codec的支持: 

    Java代码  收藏代码
    1. final MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
    2. messageDigest.reset();  
    3. messageDigest.update(string.getBytes(Charset.forName("UTF8")));  
    4. final byte[] resultByte = messageDigest.digest();  
    5. String result = Hex.encodeHexString(resultByte);  



    注意: 
    以上两种方法都使用了MessageDigest,需要特别强调:MessageDigest线程不安全。 The MessageDigest classes are NOT thread safe. If they're going to be used by different threads, just create a new one, instead of trying to reuse them. 

    3.使用第三方工具包 
    很多第三方工具都提供了md5,sha等加密方法。apache,google等都提供了工具包。 

    3.1 apache的commons-codec 
    1)maven配置(现在的版本有很多,选择自己需要的): 
            <dependency> 
                <groupId>commons-codec</groupId> 
                <artifactId>commons-codec</artifactId> 
                <version>1.6</version> 
            </dependency> 
    2)引入包后: 

    Java代码  收藏代码
    1. public static String encodeMD5Hex(String data)  
    2.     {  
    3.         return DigestUtils.md5Hex(data);  
    4.     }  


    并且该方法是线程安全的。 

    3.2 google的guava 
    Apache Common是一个时间比较久的框架了,Google针对基础框架退出了自己的类库,并且开源出来(http://code.google.com/p/guava-libraries/),名为“Guava”。它在部分功能上其实是ApacheCommon的一个子集,但在性能上做了很多优化,并且针对并发和大规模系统开发做了很多新的策略(如CopyOnWrite、Immutable、SkipList)等。虽然有些类和java.util.concurrent有些重叠,但是在一般环境下都可以替代。 

    md5示例: 

    Java代码  收藏代码
    1. Hasher hasher = Hashing.md5().newHasher();  
    2. hasher.putString("my string");  
    3. byte[] md5 = hasher.hash().asBytes();  


    既方便又安全。 
    此外,其他组织或公司也有对外提供的工具类,额。。还不清楚。 

    综上,从使用方便和安全性,性能等考虑,优先选择还是第三方的工具包。

  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/8127063.html
Copyright © 2011-2022 走看看