ソースコード
/**
* 分類名: MD5Digest<br>
* 説明: 秘密を実行するために使用される md5 パブリック パラメータ<br>
*编写日期:2001/03/05<br>
* 修正者: <br>
* 修正情報: <br>
* @著者エドガーロ[email protected]
* @バージョン1.0<br>
*/
java.security.MessageDigestをインポートします。
インポート java.security.NoSuchAlgorithmException;
パブリッククラス MD5Digest
{
プライベート MessageDigest __md5 = null;
プライベート StringBuffer __digestBuffer = null;
パブリック MD5Digest()
NoSuchAlgorithmException をスローします
{
__md5 = MessageDigest.getInstance("MD5");
__digestBuffer = 新しい StringBuffer();
public String md5crypt(String s
)
{
__digestBuffer.setLength(0);
バイト abyte0[] = __md5.digest(s.getBytes());
for(int i = 0; i < abyte0.length; i++)
__digestBuffer.append(toHex(abyte0[i]));
__digestBuffer.toString()を返します;
}
public String toHex(バイト 1){
文字列 HEX="0123456789ABCDEF";
char[] 結果=新しいchar[2];
result[0]=HEX.charAt((one & 0xf0) >> 4);
result[1]=HEX.charAt(one & 0x0f);
文字列 mm=新しい文字列(結果);
mmを返します。
}
}
-------------------------------------------------- ------------------------------
/***********************************************
MD5算法のJava Bean
@作者:トップキャット・タッピン
最終更新日:2001 年 3 月 10 日
************************************************/
パッケージ beartool;
インポート java.lang.reflect.*;
/************************************************
md5 类实现了 RSA Data Security, Inc. 提交给IETF
RFC1321 の MD5 メッセージ ダイジェスト計算法。
************************************************/
パブリック クラス MD5 {
/* 以下のこれらの S11 ~ S44 は実際には 4*4 の行列であり、元の C 実装では #define を使用して実行されます。
ここでそれらを静的最終的に実現するのは、同じプロセス空間内で複数の切り取りが可能であることを示しているだけです。
インスタンス共有*/
静的最終整数 S11 = 7;
静的最終整数 S12 = 12;
静的最終整数 S13 = 17;
静的最終整数 S14 = 22;
静的最終整数 S21 = 5;
静的最終整数 S22 = 9;
静的最終整数 S23 = 14;
静的最終整数 S24 = 20;
静的最終整数 S31 = 4;
静的最終整数 S32 = 11;
静的最終整数 S33 = 16;
静的最終整数 S34 = 23;
静的最終整数 S41 = 6;
静的最終整数 S42 = 10;
静的最終整数 S43 = 15;
静的最終整数 S44 = 21;
静的最終バイト[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,
0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、
0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、
0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0 };
/* 以下の 3 つの構成要素は、MD5 計算プロセスで使用された 3 つのコア データであり、元の C 実装で使用されています。
MD5_CTX 構造に定義されています
*/
プライベートロング[]状態=新しいロング[4]; // 状態 (ABCD)
プライベートlong[]カウント=新しいlong[2]; // ビット数、モジュロ 2^64 (lsb ファースト)
プライベートバイト[]バッファ = 新しいバイト[64]; // 入力バッファ
/* DigestHexStr は MD5 の唯一の公開ファイルであり、最新の計算結果の 16 桁の ASCII 表現です。
*/
パブリック文字列ダイジェストHexStr;
/* ダイジェストは、最新の計算結果の 2 回分の内部表示、128 ビットの MD5 値を表します。
*/
プライベート バイト[] ダイジェスト = 新しいバイト[16];
/*
getMD5ofStr は MD5 の最も主要なパブリック メソッドであり、エントリパラメータは MD5 変更を実行するための文字列です。
返されるのは変更が完了した結果であり、この結果は公開されている digestHexStr から取得されます。
*/
public String getMD5ofStr(String inbuf) {
md5Init();
md5Update(inbuf.getBytes(), inbuf.length());
md5Final();
ダイジェストHexStr = "";
for (int i = 0; i < 16; i++) {
DigestHexStr += byteHEX(digest[i]);
}
ダイジェストHexStrを返します。
}
// これは MD5 のこの種の標準構造関数です。JavaBean にはパブリックでパラメータのない構造関数が必要です
パブリック MD5() {
md5Init();
戻る;
}
/* md5Init は初期化関数数、初期化核心变量、組み込み標準の幻数 */
private void md5Init() {
カウント[0] = 0L;
カウント[1] = 0L;
///* マジック初期化定数をロードします。
状態[0] = 0x67452301L;
状態[1] = 0xefcdab89L;
状態[2] = 0x98badcfeL;
状態[3] = 0x10325476L;
戻る;
}
/* F、G、H、I は 4 つの基本的な MD5 関数であり、元の MD5 の C 実装では、それらは
単純な単位計算、おそらく効率を考慮してそれらを実現しました、Java では、私たちは把握しています
*/
private long F(long x, long y, long z) {
(x & y) を返す | ((~x) & z);
}
プライベートロング G(ロング x, ロング y, ロング z) {
リターン (x & z) | (y & (~z));
}
プライベートロング H(ロング x、ロング y、ロング z) {
x ^ y ^ z を返します。
}
プライベートロング I(ロング x, ロング y, ロング z) {
y ^ (x | (~z)) を返します。
}
/*
FF,GG,HHandII は F,G,H,I を使用して最近の変更を実行します
ラウンド 1、2、3、4 の FF、GG、HH、および II の変換。
再計算を防ぐため、回転は加算とは別に行われます。
*/
private long FF(long a、long b、long c、long d、long x、long s、
長いAC) {
a += F (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
を返します。
}
プライベートlong GG(long a、long b、long c、long d、long x、long s、
長いAC) {
a += G (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
を返します。
}
プライベートロングHH(ロングa、ロングb、ロングc、ロングd、ロングx、ロングs、
長いAC) {
a += H (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
を返します。
}
プライベートロング II(ロング a、ロング b、ロング c、ロング d、ロング x、ロング s、
長いAC) {
a += I (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
を返します。
}
/*
md5Update は MD5 の主計算手順、inbuf は変更が必要な文字列、inputlen は長さ、これは
関数は getMD5ofStr によって使用され、使用する前に md5init が必要であるため、プライベートに設定されています。
*/
private void md5Update(byte[] inbuf, int inputLen) {
int i,index,partLen;
byte[] ブロック = 新しいバイト[64];
インデックス = (int)(カウント[0] >>> 3) & 0x3F;
// /* ビット数を更新します */
if ((count[0] += (inputLen << 3)) < (inputLen << 3))
カウント[1]++;
count[1] += (inputLen >>> 29);
partLen = 64 - インデックス;
// できるだけ何度でも変換します。
if (inputLen >= partLen) {
md5Memcpy(バッファ、inbuf、インデックス、0、partLen);
md5Transform(バッファ);
for (i = partLen; i + 63 < inputLen; i += 64) {
md5Memcpy(block, inbuf, 0, i, 64);
md5Transform (ブロック);
}
インデックス = 0;
それ以外の場合は
i = 0;
///* バッファ残量入力 */
md5Memcpy(バッファ、inbuf、インデックス、i、inputLen - i);
}
/*
md5最終整理和充填写输出力結果
*/
private void md5Final () {
byte[] ビット = 新しいバイト[8];
int インデックス、padLen;
///* ビット数を保存します */
エンコード (ビット、カウント、8);
///* 56 mod 64 にパディングアウトします。
インデックス = (int)(カウント[0] >>> 3) & 0x3f;
PadLen = (インデックス < 56) ? (56 - インデックス) : (120 - インデックス);
md5Update (PADDING、padLen);
///* 長さを追加します (パディング前) */
md5Update(ビット, 8);
///* 状態をダイジェストに保存します */
エンコード (ダイジェスト、状態、16);
}
/* md5Memcpy は内部で使用されるバイト数グループのブロック コピー関数であり、入力の入力位置から出力の出力位置までの長い文字のコピーが開始されます。
*/
private void md5Memcpy (byte[] 出力、byte[] 入力、
int outpos、int inpos、int len)
{
int i;
for (i = 0; i < len; i++)
出力[outpos + i] = 入力[inpos + i];
}
/*
md5Transform は MD5 核心変更手順序、md5Update 用、ブロックは分割の原始文字节
*/
private void md5Transform (バイトブロック[]) {
long a = 状態[0]、b = 状態[1]、c = 状態[2]、d = 状態[3];
long[] x = 新しいlong[16];
デコード (x, ブロック, 64);
/* ラウンド 1 */
a = FF (a、b、c、d、x[0]、S11、0xd76aa478L); /* 1 */
d = FF (d、a、b、c、x[1]、S12、0xe8c7b756L); /* 2 */
c = FF (c、d、a、b、x[2]、S13、0x242070dbL); /* 3 */
b = FF (b、c、d、a、x[3]、S14、0xc1bdceeeL); /* 4 */
a = FF (a、b、c、d、x[4]、S11、0xf57c0fafL); /* 5 */
d = FF (d、a、b、c、x[5]、S12、0x4787c62aL); /* 6 */
c = FF (c、d、a、b、x[6]、S13、0xa8304613L); /* 7 */
b = FF (b、c、d、a、x[7]、S14、0xfd469501L); /* 8 */
a = FF (a、b、c、d、x[8]、S11、0x698098d8L); /* 9 */
d = FF (d、a、b、c、x[9]、S12、0x8b44f7afL); /* 10 */
c = FF (c、d、a、b、x[10]、S13、0xffff5bb1L); /* 11 */
b = FF (b、c、d、a、x[11]、S14、0x895cd7beL); /* 12 */
a = FF (a、b、c、d、x[12]、S11、0x6b901122L); /* 13 */
d = FF (d、a、b、c、x[13]、S12、0xfd987193L); /* 14 */
c = FF (c、d、a、b、x[14]、S13、0xa679438eL); /* 15 */
b = FF (b、c、d、a、x[15]、S14、0x49b40821L); /* 16 */
/* ラウンド 2 */
a = GG (a、b、c、d、x[1]、S21、0xf61e2562L); /* 17 */
d = GG (d、a、b、c、x[6]、S22、0xc040b340L); /* 18 */
c = GG (c、d、a、b、x[11]、S23、0x265e5a51L); /* 19 */
b = GG (b、c、d、a、x[0]、S24、0xe9b6c7aaL); /* 20 */
a = GG (a、b、c、d、x[5]、S21、0xd62f105dL); /* 21 */
d = GG (d、a、b、c、x[10]、S22、0x2441453L); /* 22 */
c = GG (c、d、a、b、x[15]、S23、0xd8a1e681L); /* 23 */
b = GG (b、c、d、a、x[4]、S24、0xe7d3fbc8L); /* 24 */
a = GG (a、b、c、d、x[9]、S21、0x21e1cde6L); /* 25 */
d = GG (d、a、b、c、x[14]、S22、0xc33707d6L); /* 26 */
c = GG (c、d、a、b、x[3]、S23、0xf4d50d87L); /* 27 */
b = GG (b、c、d、a、x[8]、S24、0x455a14edL); /* 28 */
a = GG (a、b、c、d、x[13]、S21、0xa9e3e905L); /* 29 */
d = GG (d、a、b、c、x[2]、S22、0xfcefa3f8L); /* 30 */
c = GG (c、d、a、b、x[7]、S23、0x676f02d9L); /* 31 */
b = GG (b、c、d、a、x[12]、S24、0x8d2a4c8aL); /* 32 */
/* ラウンド 3 */
a = HH (a、b、c、d、x[5]、S31、0xfffa3942L); /* 33 */
d = HH (d、a、b、c、x[8]、S32、0x8771f681L); /* 34 */
c = HH (c、d、a、b、x[11]、S33、0x6d9d6122L); /* 35 */
b = HH (b、c、d、a、x[14]、S34、0xfde5380cL); /* 36 */
a = HH (a、b、c、d、x[1]、S31、0xa4beea44L); /* 37 */
d = HH (d、a、b、c、x[4]、S32、0x4bdecfa9L); /* 38 */
c = HH (c、d、a、b、x[7]、S33、0xf6bb4b60L); /* 39 */
b = HH (b、c、d、a、x[10]、S34、0xbebfbc70L); /* 40 */
a = HH (a、b、c、d、x[13]、S31、0x289b7ec6L); /* 41 */
d = HH (d、a、b、c、x[0]、S32、0xeaa127faL); /* 42 */
c = HH (c、d、a、b、x[3]、S33、0xd4ef3085L); /* 43 */
b = HH (b、c、d、a、x[6]、S34、0x4881d05L); /* 44 */
a = HH (a、b、c、d、x[9]、S31、0xd9d4d039L); /* 45 */
d = HH (d、a、b、c、x[12]、S32、0xe6db99e5L); /* 46 */
c = HH (c、d、a、b、x[15]、S33、0x1fa27cf8L); /* 47 */
b = HH (b、c、d、a、x[2]、S34、0xc4ac5665L); /* 48 */
/* ラウンド 4 */
a = II (a、b、c、d、x[0]、S41、0xf4292244L); /* 49 */
d = II (d、a、b、c、x[7]、S42、0x432aff97L); /* 50 */
c = II (c、d、a、b、x[14]、S43、0xab9423a7L); /* 51 */
b = II (b、c、d、a、x[5]、S44、0xfc93a039L); /* 52 */
a = II (a、b、c、d、x[12]、S41、0x655b59c3L); /* 53 */
d = II (d、a、b、c、x[3]、S42、0x8f0ccc92L); /* 54 */
c = II (c、d、a、b、x[10]、S43、0xffeff47dL); /* 55 */
b = II (b、c、d、a、x[1]、S44、0x85845dd1L); /* 56 */
a = II (a、b、c、d、x[8]、S41、0x6fa87e4fL); /* 57 */
d = II (d、a、b、c、x[15]、S42、0xfe2ce6e0L); /* 58 */
c = II (c、d、a、b、x[6]、S43、0xa3014314L); /* 59 */
b = II (b、c、d、a、x[13]、S44、0x4e0811a1L); /* 60 */
a = II (a、b、c、d、x[4]、S41、0xf7537e82L); /* 61 */
d = II (d、a、b、c、x[11]、S42、0xbd3af235L); /* 62 */
c = II (c、d、a、b、x[2]、S43、0x2ad7d2bbL); /* 63 */
b = II (b、c、d、a、x[9]、S44、0xeb86d391L); /* 64 */
状態[0] += a;
状態[1] += b;
状態[2] += c;
状態[3] += d;
}
/*Java の long 型は 64 ビットであるため、long 型をバイト数にエンコードします。
低 32 ビットのみ、C の本来の用途に適しています
*/
private void Encode (byte[] 出力、long[] 入力、int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
出力[j] = (バイト)(入力[i] & 0xffL);
出力[j + 1] = (バイト)((入力[i] >>> 8) & 0xffL);
出力[j + 2] = (バイト)((入力[i] >>> 16) & 0xffL);
出力[j + 3] = (バイト)((入力[i] >>> 24) & 0xffL);
}
}
/*Java の long 型は 64 ビットであるため、デコードするバイト数組を長い数組に合成します。
低 32 ビット、高 32 ビット清零のみを合成して、C の実現に適した用途に使用する
*/
private void デコード (long[] 出力、byte[] 入力、int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
出力[i] = b2iu(入力[j]) |
(b2iu(入力[j + 1]) << 8) |
(b2iu(入力[j + 2]) << 16) |
(b2iu(入力[j + 3]) << 24);
戻る;
}
/*
b2iu は私が書いたハンドルバイト写真であり、java には署名されていない演算が含まれていないため、正しい番号の本来の"升位"プログラムが無視されます。
*/
public static long b2iu(byte b) {
b < 0 を返しますか? b & 0x7F + 128 : b;
}
/*byteHEX()、バイト型の数値を十六進制に変換するための ASCII 表示、
Java 内のバイトの toString 無法がこの点を実現するため、私は C 言語内にありません
sprintf(outbuf,"%02X",ib)
*/
パブリック静的文字列 byteHEX(byte ib) {
char[] 数字 = { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F' };
char [] ob = 新しいchar[2];
ob[0] = 数字[(ib >>> 4) & 0X0F];
ob[1] = 数字[ib & 0X0F];
文字列 s = 新しい文字列(ob);
を返します。
public static void main(String args[])
{
MD5 m = 新しい MD5();
if (Array.getLength(args) == 0) { //如果有パラメータ,実行標準的テストスイート
System.out.println("MD5 テスト スイート:");
System.out.println("MD5(""):"+m.getMD5ofStr(""));
System.out.println("MD5("a"):"+m.getMD5ofStr("a"));
System.out.println("MD5("abc"):"+m.getMD5ofStr("abc"));
System.out.println("MD5("メッセージ ダイジェスト"):"+m.getMD5ofStr("メッセージ ダイジェスト"));
System.out.println("MD5("abcdefghijklmnopqrstuvwxyz"):"+
m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
System.out.println("MD5("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"):"+
m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
}
それ以外
System.out.println("MD5(" + args[0] + ")= + m.getMD5ofStr(args[0]));
}
}
JSPでの使用方法
------------------------------------------ ----------------------------------
<%@ ページ言語='java' %>
<jsp:useBean id='oMD5'scope='request' class='beartool.MD5'/>
<%@ page import='java.util.*'%>
<%@ page import='java.sql.*'%>
<html>
<本文>
<%
文字列 userid = request.getParameter("UserID"); //取得用户输入力UserID
文字列パスワード = request.getParameter("パスワード"); //取得用の入力されたパスワード
文字列 pwdmd5 = oMD5.getMD5ofStr(パスワード); //MD5 の値を計算します
PrintWriter rp = 応答.getWriter();
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
接続 con = DriverManager.getConnection("jdbc:odbc:community", "", "");
ステートメント stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from users where userID ='"+userid+"' and pwdmd5= '" + pwdmd5+"'" );
if (rs.next())
{
rp.print("ログインOK");
}
それ以外
{
rp.print("ログイン失敗");
stmt.close
();
con.close();
%>
</body>
</html>