(转帖)一个实现MD5的简洁的java类

来自:http://www.javaresearch.org/article/showarticle.jsp?column=33&thread=10461

×××××××××××××××××××××××××××××××××××××××××××××××××××××

                         正文

一个实现MD5的简洁的java类

Jagie 原创  (参与分:100322,专家分:3090)   发表:2003-11-18 17:14   更新:2003-11-19 08:34   版本:1.0   阅读:6307次 

 

关键词:md5

由于消息摘要唯一性和不可逆性的特点,所以不失为一种简单的常用的加密手段,比如你可以用md5来加密你的应用中的用户口令。

package test;

import java.security.MessageDigest;

/**

 * <p>Title: </p>

 * <p>Description: </p>

 * <p>Copyright: Copyright (c) 2003</p>

 * <p>Company: </p>

 * @author unascribed

 * @version 1.0

 */

public class StringUtil {

  private final static String[] hexDigits = {

      "0", "1", "2", "3", "4", "5", "6", "7",

      "8", "9", "a", "b", "c", "d", "e", "f"};

  /**

   * 转换字节数组为16进制字串

   * @param b 字节数组

   * @return 16进制字串

   */

  public static String byteArrayToHexString(byte[] b) {

    StringBuffer resultSb = new StringBuffer();

    for (int i = 0; i < b.length; i++) {

      resultSb.append(byteToHexString(b[i]));

    }

    return resultSb.toString();

  }

  private static String byteToHexString(byte b) {

    int n = b;

    if (n < 0)

      n = 256 + n;

    int d1 = n / 16;

    int d2 = n % 16;

    return hexDigits[d1] + hexDigits[d2];

  }

  public static String MD5Encode(String origin) {

    String resultString = null;

    try {

      resultString=new String(origin);

      MessageDigest md = MessageDigest.getInstance("MD5");

      resultString=byteArrayToHexString(md.digest(resultString.getBytes()));

    }

    catch (Exception ex) {

    }

    return resultString;

  }

  public static void main(String[] args){

    System.err.println(MD5Encode("a"));

  }

}

在RFC 1321中,给出了Test suite用来检验你的实现是否正确:

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e

MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661

MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0

MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b

参考资料:《java security handbook》 jamie jaworski

版权声明   给作者写信  本篇文章对您是否有帮助?  投票: 是    否     投票结果:     24       1

 

 

 

作者其它文章:

在MIDP2.0中操作图片像素

用MMAPI拍照

如何在Swing中实现文件路径选择的TableCellEditor

MIDP中一个简单的折行文本绘制办法

在MIDP1.0下实现图片翻转

作者全部文章 

 

 

  评论人:yipsilon    参与分: 15609    专家分: 290    来自: Dalian

 发表时间: 2003-11-20 19:29 

使用这种方式的前提是必需有JCE支持。如果在J2SDK 1.3中,则必需下载额外的jce包。 

 

  评论人:Jagie    参与分: 100322    专家分: 3090    来自: 北京

 发表时间: 2003-11-21 11:11 

java.security.MessageDigest是jdk自带的,无需使用javax.crypto包,所以无需下载jce.

至少我在运行这个例子的时候就没有下载jce

 

 

  评论人:rower    参与分: 167    专家分: 0  发表时间: 2004-04-10 17:10 

实际测试,在J2SDK 1.3中无需下载额外的jce包,运行良好。 

 

  评论人:huangyafei    参与分: 80    专家分: 0  发表时间: 2005-03-06 13:41 

怎么我在运行上面的程序的时候出错了:出错信息为:

D:\works\java\MD5Encode.java:12: class StringUtil is public, should be declared in a file named StringUtil.java

public class StringUtil {

       ^

1 error

 

 

  评论人:yifenggege    参与分: 259    专家分: 70  发表时间: 2005-07-13 14:12 

好! 

 

  评论人:keli    参与分: 34262    专家分: 1320  发表时间: 2005-11-16 17:24 

加密是可以的,但是解密就难了。呵呵。

我看第5个答复想笑,哈哈哈哈。 

 

  评论人:gui_jq    参与分: 73813    专家分: 1070    来自: 广州天河

 发表时间: 2005-12-01 18:28 

写得不错,我最近要写个radius协议分析的工具想用java来编写,所以第一得弄java下面的MD5实现,没有想到如此简单,jdk原来就带有了,最坏的打算我还想用c的代码改一个呢。呵呵。在这里我补充一下:

1,MD5本来就是不可逆的,加密只是保证在网络传输中内容不被修改,可以通过md5来检查,防止有人修改包内容进行模仿发包,所以服务端在受到包写更加对方的算法来md5一次然后在处理包内容,如果不通过则直接丢弃包。另外就是用来验证下载的重要文件是否正确和完整。

2,程序中的打印16进制方法有点欠妥,在c里面可以通过printf("%02x",buf[])就可以,但是java对byte的处理没有这个。所以我推荐下面的方法:

private static String dumpBytes(byte[] bytes) {

    int i;

    StringBuffer sb = new StringBuffer();

    for (i = 0; i < bytes.length; i++) {

      if (i % 32 == 0 && i != 0) {

        sb.append("\n");

      }

      String s = Integer.toHexString(bytes[i]);

      if (s.length() < 2) {

        s = "0" + s;

      }

      if (s.length() > 2) {

        s = s.substring(s.length() - 2);

      }

      sb.append(s);

    }

    return sb.toString();

  }

这个更加灵活高效。

补充结束。谢谢大家。呵呵。