1. 程式人生 > >java md5加密

java md5加密

package com.test;


import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 採用MD5加密解密
 * @author tfq
 * @datetime 2011-10-13
 */
public class md5 {

	/***
	 * MD5加碼 生成32位md5碼
	 */
	public static String string2MD5(String inStr){
		MessageDigest md5 = null;
		try{
			md5 = MessageDigest.getInstance("MD5");
		}catch (Exception e){
			System.out.println(e.toString());
			e.printStackTrace();
			return "";
		}
		char[] charArray = inStr.toCharArray();
		byte[] byteArray = new byte[charArray.length];

		for (int i = 0; i < charArray.length; i++)
			byteArray[i] = (byte) charArray[i];
		byte[] md5Bytes = md5.digest(byteArray);
		StringBuffer hexValue = new StringBuffer();
		for (int i = 0; i < md5Bytes.length; i++){
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16)
				hexValue.append("0");
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();

	}

	/**
	 * 加密解密演算法 執行一次加密,兩次解密
	 */ 
	public static String convertMD5(String inStr){

		char[] a = inStr.toCharArray();
		for (int i = 0; i < a.length; i++){
			a[i] = (char) (a[i] ^ 't');
		}
		String s = new String(a);
		return s;

	}

	// 測試主函式
	public static void main(String args[]) {
		String s = new String("tangfuqiang");
		System.out.println("原始:" + s);
		System.out.println("MD5後:" + string2MD5(s));
		System.out.println("加密的:" + convertMD5(s));
		System.out.println("解密的:" + convertMD5(convertMD5(s)));

	}
}


先前寫了一個使用者登陸的程式,對user的password加密時老是出現問題(我是用java自帶的messagedigest做的),過程是這樣的,註冊的時候,將password加密後在儲存到sql中,登陸的時候,將使用者輸入的password再一次加密後與資料庫中的password比較,錯誤就發生在這裡,我一共使用了兩次messagedigest對password加密,這兩次messagedigest所用的鹽是不同的,也就是說,對一個String型別的資料沒使用一次messagedigest就會有一種新的加密後的結果,而且MD5加密是不可逆的,網上的許多的md5是別人自己編的,比較麻煩,本人也沒有測試夠,不過自己找到一個,裡面的都是靜態的方法,和連線資料庫一樣,只有定義一個物件,就行,十分好用。