Posted on 2008-10-21 23:36
viita 阅读(1032)
评论(0) 编辑 收藏 所属分类:
struts
MD5的全称是Message-digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。
在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
具体的一个MD5实现:
1
package com.meng;
2
3
4
import java.security.MessageDigest;
5
6
/** *//**
7
* <p>
8
* Title:
9
* </p>
10
* <p>
11
* Description:
12
* </p>
13
* <p>
14
* Copyright: Copyright (c) 2003
15
* </p>
16
* <p>
17
* Company:
18
* </p>
19
*
20
* @author unascribed
21
* @version 1.0
22
*/
23
24
public class MD5
{
25
26
private final static String[] hexDigits =
{ "0", "1", "2", "3", "4", "5",
27
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
28
29
/** *//**
30
* 转换字节数组为16进制字串
31
*
32
* @param b
33
* 字节数组
34
* @return 16进制字串
35
*/
36
37
public static String byteArrayToHexString(byte[] b)
{
38
StringBuffer resultSb = new StringBuffer();
39
for (int i = 0; i < b.length; i++)
{
40
resultSb.append(byteToHexString(b[i]));
41
}
42
return resultSb.toString();
43
}
44
45
private static String byteToHexString(byte b)
{
46
int n = b;
47
if (n < 0)
48
n = 256 + n;
49
int d1 = n / 16;
50
int d2 = n % 16;
51
return hexDigits[d1] + hexDigits[d2];
52
}
53
54
public static String MD5Encode(String origin)
{
55
String resultString = null;
56
57
try
{
58
resultString = new String(origin);
59
MessageDigest md = MessageDigest.getInstance("MD5");
60
resultString = byteArrayToHexString(md.digest(resultString
61
.getBytes()));
62
} catch (Exception ex)
{
63
64
}
65
return resultString;
66
}
67
68
public static void main(String[] args)
{
69
System.err.println(MD5Encode("哈哈"));
70
71
72
73
}
74
}
75
76