java加密解密研究6、MD演算法家族
一、簡述
MD5演算法是典型的訊息摘要演算法,其前身有MD2、MD3和MD4演算法,它由MD4、MD3和MD2演算法改進而來。不論是哪一種MD演算法,它們都需要獲得一個隨機長度的資訊併產生一個123位的資訊摘要。如果將這個128位的二進位制摘要資訊換算成十六進位制,可以得到一個32位的字串,故我們見到的大部分MD5演算法的數字指紋都是32為十六進位制的字串。
MD演算法家族的發展史:
MD2演算法:
1989年,著名的非對稱演算法RSA發明人之一----麻省理工學院教授羅納德.李維斯特開發了MD2演算法。這個演算法首先對資訊進行資料補位,使資訊的位元組長度是16的倍數。再以一個16位的檢驗和做為補充資訊追加到原資訊的末尾。最後根據這個新產生的資訊計算出一個128位的雜湊值,MD2演算法由此誕生。
MD4演算法:
1990年,羅納德.李維斯特教授開發出較之MD2演算法有著更高安全性的MD4演算法。在這個演算法中,我們仍需對資訊進行資料補位。不同的是,這種補位使其資訊的位元組長度加上448個位元組後成為512的倍數(資訊位元組長度mod 512 =448)。此外,關於MD4算的處理和MD2演算法有很大的差別。但最終仍舊會獲得一個128為的雜湊值。MD4演算法對後續訊息摘要演算法起到了推動作用,許多比較有名的訊息摘要演算法都是在MD4演算法的基礎上發展而來的,如MD5、SHA-1、RIPE-MD和HAVAL演算法等。
MD5演算法:
1991年,繼MD4演算法後,羅納德.李維斯特教授開發了MD5演算法,將MD演算法推向成熟。MD5演算法經MD2、MD3和MD4演算法發展而來,演算法複雜程度和安全強度打打提高,但浙西MD演算法的最終結果都是產生一個128位的資訊摘要。這也是MD系列演算法的特點。
一、java提供的MD2和MD5演算法應用
package com.tao.test; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import javax.xml.bind.annotation.adapters.HexBinaryAdapter; /** * MD加密工具類 */ class MDCoder { // MD2加密 public static String encodeMd2(byte[] data) throws Exception { // 初始化MessageDigest MessageDigest md = MessageDigest.getInstance("MD2"); // 執行摘要資訊 byte[] digest = md.digest(data); // 將摘要資訊轉換為32位的十六進位制字串 return new String(new HexBinaryAdapter().marshal(digest)); } // MD5加密 public static String encodeMd5(byte[] data) throws Exception { // 初始化MessageDigest MessageDigest md = MessageDigest.getInstance("MD5"); // 執行摘要資訊 byte[] digest = md.digest(data); // 將摘要資訊轉換為32位的十六進位制字串 return new String(new HexBinaryAdapter().marshal(digest)); } } public class MDTest { public static void main(String[] args) throws UnsupportedEncodingException, Exception { String testString = "123456asdasdfsdfsdfsdf"; System.out.println(MDCoder.encodeMd2(testString.getBytes())); System.out.println(MDCoder.encodeMd5(testString.getBytes())); } }
二、BouncyCastle補充的MD4演算法的應用
package Test;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
/**
* MD加密工具類
*/
class MDCoder {
// MD2加密
public static String encodeMd4(byte[] data) throws Exception {
//加入BouncyCastle的支援
Security.addProvider(new BouncyCastleProvider());
// 初始化MessageDigest
MessageDigest md = MessageDigest.getInstance("MD4");
//執行摘要資訊
byte[] digest=md.digest(data);
//將摘要資訊轉換為32位的十六進位制字串
return new String(Hex.encode(digest));
}
}
public class MDTest {
public static void main(String[] args) throws UnsupportedEncodingException, Exception {
String testString="123456asdasdfsdfsdfsdf";
String digestString=MDCoder.encodeMd4(testString.getBytes());
System.out.println(digestString);
}
}
三、Commons Codec提供的實現
Commons Codec提供了訊息摘要的工具類-----DigestUtils類。DigestUtils類是對Sun提供的MessageDigest類的一次封裝,提供了MD5和SHA系列訊息摘要演算法的實現。
package Test;
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
/**
* MD加密工具類
*/
class MDCoder {
// MD5加密 返回十六進位制的字串
public static String encodeMd5Hex(byte[] data) throws Exception {
return DigestUtils.md5Hex(data);
}
// MD5加密,返回十進位制的位元組陣列
public static byte[] encodeMd5(byte[] data) {
return DigestUtils.md5(data);
}
}
public class MDTest {
public static void main(String[] args) throws UnsupportedEncodingException, Exception {
String testString = "123456asdasdfsdfsdfsdf";
//十六進位制的字串
String digestString = MDCoder.encodeMd5Hex(testString.getBytes());
System.out.println(digestString);
//位元組陣列
byte[] digest=MDCoder.encodeMd5(testString.getBytes());
String dString=new String(Hex.encodeHex(digest));
System.out.println(dString);
}
}
實際應用中根據自己的選擇用選擇不同的方法來實現MD訊息摘要演算法
相關推薦
java加密解密研究6、MD演算法家族
一、簡述 MD5演算法是典型的訊息摘要演算法,其前身有MD2、MD3和MD4演算法,它由MD4、MD3和MD2演算法改進而來。不論是哪一種MD演算法,它們都需要獲得一個隨機長度的資訊併產生一個123位的資訊摘要。如果將這個128位的二進位制摘要資訊換算成十六進位制,可以得到
java加密解密研究2、Bouncy Castle和Commons Codec加密元件
在java的加密解密的API中,幾乎各種常用的加密演算法都能找到對應的實現,但還是難免會有遺憾:受出口限制,金鑰長度上不能滿足要求;部分演算法未能支援,如MD4、SHA-224等演算法;API使用起來還不是很方便;一些常用的進位制轉換輔助工具未能提供,如Base64轉換、十
JAVA加密解密之凱撒加密(Caesar cipher)演算法
凱撒加密演算法簡介 凱撒加密(Caesar cipher)是一種簡單的訊息編碼方式:它根據字母表將訊息中的每個字母移動常量位k。舉個例子如果k等於3,則在編碼後的訊息中,每個字母都會向前移動3位:a會被替換為d;b會被替換成e;依此類推。字母表末尾將回捲到字母
Java 加密解密 對稱加密演算法 非對稱加密演算法 MD5 BASE64 AES RSA
【前言】 本文簡單的介紹了加密技術相關概念,最後總結了java中現有的加密技術以及使用方法和例子 【最簡單的加密】1.簡單的概念 明文:加密前的資訊 密文:機密後的資訊 演算法:加密或解密的演算法 金鑰:演算法使用的鑰匙(讀作miyao,正確應該是miyue,但是大家都讀m
JAVA加密解密之DH(Diffie-Hellman)演算法
DH演算法簡介 Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成”一致”的、可以共享的金鑰。換句話說,就是由甲方產出
第十八篇:JAVA加密解密之DH(Diffie-Hellman)演算法
DH演算法簡介 Diffie-Hellman演算法(D-H演算法),金鑰一致協議。是由公開金鑰密碼體制的奠基人Diffie和Hellman所提出的一種思想。簡單的說就是允許兩名使用者在公開媒體上交換資訊以生成”一致”的、可以共享的金鑰。換句話說,就是由甲方產出一對金鑰(
password學4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
加密解密 hash函數 -s -m hmac 可能 正向 技術發展 哈希算法 Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又稱為數字摘要(Digital Digest)。它是一個唯一相
java加密解密
子郵件 openssl sock 天數 file 驗證 word genrsa https 一:1.KeyManagerFactory類(密鑰管理工廠,用來管理密鑰): 構建密鑰庫管理工廠與下例一樣: System.setProperty("javax.net.ssl.k
java加密解密技術(3)對稱加密AES
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; imp
Java 加密解密工具類AESUtil
package test; /* @auther wjh @date 2018-08-01*/ import java.security.SecureRandom; import javax.crypto.Cipher; import javax.cry
Java加密解密之數字簽名
上一篇帖子,我們講了MAC(訊息認證碼),它可以驗證身份和防篡改。 它的機制是通過通訊雙方都持有相同的祕鑰去實現,祕鑰相同摘要才相同,沒有祕鑰就不能生成正確的摘要資訊。 但是,它有個缺點,就是通訊雙方必須持有相同的祕鑰,解決方法就是使用數字簽名 數字簽名(又稱公鑰數字簽名、
Java加密解密之對稱加密
採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 其核心思想是,加密和解密都是同一個祕鑰 對稱加密常用的演算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJAC
java伺服器開發:6、寫第一個Servlet
宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 一、什麼是servlet? 1)擴充套件web伺服器功能 2)元件規範 二、如何開發一個servlet? 1)環境搭建 2)手動開發Servlet 3)MyEcli
Java 加密解密工具
package com.panda.core.db.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import
Java加密解密之MAC(訊息認證碼)
上一篇帖子,我們講了訊息摘要(數字摘要),它是把一個文字/檔案 通過摘要函式(hash函式)計算出一個結果。然後把文字/檔案和摘要結果一同發給接受者 接受者接收到檔案之後,也進行摘要,把兩個摘要結果進行對比。如果一致就說明文字/檔案和摘要是一致的 但是,這裡有個問題,假設A
Java加密解密全解
1 sha加密: 安全雜湊演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^6
【開發工具】JAVA效能分析:6、超詳細的JProfiler記憶體分析(官方中文版)
Memory Profiling——記憶體分析 有兩種方法可以獲取有關堆上物件的資訊。一方面,分析代理可以跟蹤每個物件的分配和垃圾收集。在JProfiler中,這稱為“分配記錄”。它告訴您已分配物件的位置,還可用於建立有關臨時物件的統計資訊。另一方面,JVM的分析介面允許分析代理採用“堆快照”,
Java加密解密之非對稱加密
非對稱加密演算法需要兩個金鑰來進行加密和解密,這兩個祕鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。使用公鑰加密的,要使用私鑰解密。反之,使用私鑰加密的,要使用公鑰解密。 和對稱加密的區別是: 對稱加密:加密和解密時使用的是
java加密解密和簽名的問題
注意:加密:先用公鑰加密再用私鑰解密 解密:先用私鑰解密再用公鑰解密 因為公鑰加密長度<127 私鑰》127 關於簽名: debug--除錯 release--釋出--正式簽名--android.keystore 應用升級:包名相同 簽名
JAVA加密解密之數字證書
系統之間在進行互動的時候,我們經常會用到數字證書,數字證書可以幫我們驗證身份等,下面我們就來看一下在java中如何使用數字證書。 我們先使用keytool工具生成金鑰庫並匯出公鑰證書。 第一步:生成keyStroe檔案 執行如下命令: keyto