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

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

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

  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 files\java\jdk1.6\jre\lib\rt.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的支持:

  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)引入包后:

  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示例:

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

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

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

MD5 几种方法的选择的更多相关文章

  1. MD5三种方法的学习总结

    MD5百度百科 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已 ...

  2. asp.net和js读取文件的MD5值的方法

    前言 文件的md5值,即文件签名,为了验证文件的正确性,是否被恶意篡改等.每个文件有一个唯一的md5值. 最近公司开发的app文件包的校验就有用到文件md5值. 一.asp.net获取 ①和上传文件一 ...

  3. (转载)eclipse插件安装的四种方法

    eclipse插件安装的四种方法 Eclipse插件的安装方法 1.在eclipse的主目录(ECLIPSE_HOME, 比如在我的机器上安装的目录是:D:\eclipse)有一个plugins的目录 ...

  4. Java 打印堆栈的几种方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. eclipse插件安装的四种方法

    Eclipse插件的安装方法 1.在eclipse的主目录(ECLIPSE_HOME,比如在我的机器上安装的目录是:D:\eclipse)有一个plugins的目录,这种方法的插件安装非常简单,只要将 ...

  6. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  7. [信安Presentation]一种基于GPU并行计算的MD5密码解密方法

    -------------------paper--------------------- 一种基于GPU并行计算的MD5密码解密方法 0.abstract1.md5算法概述2.md5安全性分析3.基 ...

  8. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  9. 【python】-- Socket粘包问题 ,解决粘包的几种方法、socket文件下载,md5值检验

    上一篇随笔:“socket 接收大数据”,在win系统上能够运行,并且解决了大数据量的数据传输出现的问题,但是运行在linux系统上就会出现如下图所示的情况: 就是服务端两次发送给客户端的数据(第一次 ...

随机推荐

  1. [例1.10]使用setw设置输出宽度的例子

    [例1.10]使用setw设置输出宽度的例子: #include <iostream> #include <iomanip> using namespace std; void ...

  2. Date、DateFormat、SimpleDateFormat、Calendar

    package com.Date; import java.util.Date; /* * Date 表示特定的瞬间,精确到毫秒 * JDK1.0开始 * 构造方法(常用的方法,过时的不管): * D ...

  3. OMAP4之DSP核(Tesla)软件开发学习(二)Linux内核驱动支持OMAP4 DSP核

    注:必须是Linux/arm 3.0以上内核才支持RPMSG,在此使用的是.config - Linux/arm 3.0.31 Kernel Configuration.(soure code fro ...

  4. CentOS6下源码安装mysql-5.6.25

    1.1.系统环境检查 1)检查系统版本 mkdir -p /server/tools/ cd /server/tools/ cat /etc/redhat-release 2)配置域名解析 vim / ...

  5. javaScript基础篇之数据类型

    我主要学习廖雪峰老师官方网站的javaScript,所以很多都是出自于廖老师,请见谅.以下是廖老师的官方网站的地址:http://www.liaoxuefeng.com/wiki/0014344466 ...

  6. Redis之数据持久化RDB与AOF

    Redis之数据持久化RDB与AOF https://www.cnblogs.com/zackku/p/10087701.html 大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内 ...

  7. ringojs 的包管理

    ringojs 集成了包管理目前有几种方式 ringo-admin rp ringo-admin 安装包 我们使用ringo-admin 安装rp ringo-admin install grob/r ...

  8. hibernate enum映射详解

    hibernate enum映射详解 在这里介绍注解的形式,如果想要了解XML配置的方式,可以自行查找相关资料. 例如以下Entity @Entity @Table(name = "t_us ...

  9. Erlang tool -- recon

    遇见recon 以来, 每次定位系统瓶颈, 总是能让我眼前一亮. 比如说, 定位非尾递归导致的内存暴涨, 定位引发CPU满载的进程.得心应手,每每额手称庆. recon 是ferd 大神 释出的一个 ...

  10. 教你使用markdown画程序流程图

    2016-01-21 10:33:15 星期四 1. 入门案例 st=>start: Start op=>operation: Your Operation sub=>subrout ...