来自: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();
}
这个更加灵活高效。
补充结束。谢谢大家。呵呵。