Posted on 2008-10-21 23:36
viita 閱讀(1037)
評論(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