1. 程式人生 > >【密碼學】基於Java的MD5加密實現方式

【密碼學】基於Java的MD5加密實現方式

1.什麼是MD5

            MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt檔案中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內容,你對這個檔案重新計算MD5時就會發現(兩個MD5值不相同)。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數字簽名應用。

2.Java中實現MD5

/**
	 * MD5加密方式(1)
	 * @param message
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws UnsupportedEncodingException
	 */
	public static String md5Encode(String message) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		//得到一個資訊的摘要器
		MessageDigest digest = MessageDigest.getInstance("MD5");
		byte [] result = digest.digest(message.getBytes("UTF-8"));
		StringBuffer buffer = new StringBuffer();
		//把每一個byte 做一個與運算 0xff
		for(byte b:result) {
			int number = b&0xff;
			String str = Integer.toHexString(number);
			if(str.length()==1) {
				buffer.append("0"); 
			}
			buffer.append(str);
			
		}
		//標準的MD5加密後的結果
		return buffer.toString().toUpperCase();
	}
/**
	 * 普通的MD5加密方式(2)
	 * @param message
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws NoSuchAlgorithmException
	 */
	public static String publicMd5Encode(String message) throws UnsupportedEncodingException, NoSuchAlgorithmException {
		char [] haxDigests = {'0','1','2','3','4','5','6','7','8','9','A',
				'B','C','D','E','F'};
		byte [] result = message.getBytes("UTF-8");
		//獲得MD5摘要演算法的 MessageDigest物件
		MessageDigest md5Digest = MessageDigest.getInstance("MD5");
		//使用指定的位元組更新摘要
		md5Digest.update(result);
		//獲得密文
		byte [] md = md5Digest.digest();
		
		int j = md.length;
		char [] str = new char[j*2];
		int k = 0;
		for(int i=0;i<j;i++) {
			byte byte0 = md[i];
			str[k++] = haxDigests[byte0>>4&0xf];
			str[k++] = haxDigests[byte0&0xf];
		}
		return new String(str);
	}
public static void main(String[] args) {
		String Md5="";
		String pMd5 = "";
		try {
			Md5 = md5Encode("上海");
			pMd5 = publicMd5Encode("上海");
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("加密資料失敗");
		}
		
		System.out.println("方式1:"+Md5);//E94E8BD35FC8144F38FD1EBC1F81AB36
		System.out.println("方式2:"+pMd5);//E94E8BD35FC8144F38FD1EBC1F81AB36
		
		
	}

 

 

注意:message.getBytes("UTF-8"),將字串變為位元組陣列的時候,需要設定一個編碼格式,如果不設定的很可能導致生成的MD5加密結果與其他人生成的加密結果不一致

 

參考:https://blog.csdn.net/zjx2016/article/details/75069169/