這篇文章主要介紹了Java 詳解單向加密--MD5、SHA和HMAC及簡單實現實例的相關資料,需要的朋友可以參考下
Java 詳解單向加密--MD5、 SHA和HMAC及簡單實作實例
摘要:
MD5、SHA、HMAC這三種加密演算法,可謂是非可逆加密,就是不可解密的加密方法。
MD5
MD5即Message-Digest Algorithm 5(訊息-摘要演算法5),用於確保訊息傳輸完整一致。 MD5是輸入不定長度訊息,輸出固定長度128-bits的演算法。
MD5演算法有以下特點:
1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原資料計算MD5值很容易。
3、抗修改性:對原始資料進行任何改動,即使只修改1個位元組,所得到的MD5值都有很大差異。
4、強抗碰撞:已知原始資料和其MD5值,想找出一個具有相同MD5值的資料(即偽造資料)是非常困難的。
MD5也廣泛用於作業系統的登陸認證上,如Unix、各類BSD系統登入密碼、數位簽章等諸多面向。如在Unix系統中使用者的密碼是以MD5(或其它類似的演算法)經Hash運算後儲存在檔案系統中。當使用者登入的時候,系統會把使用者輸入的密碼進行MD5 Hash運算,然後再去和儲存在檔案系統中的MD5值進行比較,進而確定輸入的密碼是否正確。透過這樣的步驟,系統在不知道使用者密碼的明碼的情況下就可以確定使用者登入系統的合法性。這可以避免使用者的密碼被具有系統管理員權限的使用者知道。 MD5將任意長度的「位元組字串」映射為一個128bit的大整數,並且透過該128bit反推原始字串是非常困難的。
SHA
SHA(Secure Hash Algorithm,安全雜湊演算法),數位簽章等密碼學應用中重要的工具,被廣泛地應用於電子商務等資訊安全領域。雖然SHA與MD5透過碰撞法都破解了, 但SHA仍然是公認的安全加密演算法,較之MD5更安全。
SHA所定義的長度
下表中的中繼雜湊值(internal state)表示每個資料區塊壓縮雜湊過後的中繼值(internal hash sum)。
演算法 | #輸出雜湊值長度(bits) | #中繼雜湊值長度(bits) | 資料區塊長度(bits) | 最大輸入訊息長度(bits) | 一個Word長度(bits) | 循環次數 | 使用到的運算子 | 碰撞攻擊 |
---|---|---|---|---|---|---|---|---|
#SHA-0 | 160 | 160 | 512 | 264 − 1 | #32 | #80 | +,and,or,xor,rotl | 是 |
SHA-1 | 160 | #160 | 512 | 264 − 1 | 32 | 80 | +,and,or,xor,rotl | 存在263的攻擊 |
SHA -256/224 | 256/224 | 256 | 512 | 264 − 1 | #32 | #64 | +,and,or,xor,shr,rotr | 尚未出現 |
#SHA-512/384 | 512/ 384 | 512 | 1024 | 2128 − 1 | 64 | 80 | #+,and,or, xor,shr,rotr | 尚未出現 |
#HMAC
HMAC(Hash Message Authentication Code ),雜湊訊息鑑別碼,基於金鑰的Hash演算法的認證協定。訊息鑑別碼實作鑑別的原理是,用公開函數和金鑰產生一個固定長度的值作為認證標識,用這個標識來鑑別訊息的完整性。使用一個金鑰產生一個固定大小的小資料塊,即MAC,並將其加入到訊息中,然後傳輸。接收方利用與發送方共享的金鑰進行鑑別認證等。
Java範例
package com.zzj.encryption; import java.security.MessageDigest; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * 单向加密(非可逆加密) * @author lenovo * */ public class OneWayEncryption { static final String ALGORITHM_MD5 = "MD5"; static final String ALGORITHM_SHA = "SHA"; /** * MAC算法可选以下多种算法 * <pre class="brush:php;toolbar:false"> * HmacMD5 * HmacSHA1 * HmacSHA256 * HmacSHA384 * HmacSHA512 **/ static final String ALGORITHM_MAC = "HmacMD5"; /** 密钥 **/ static final String MAC_KEY = "abcdef"; public static void main(String[] args) throws Exception { String source = "我是程序猿!我很骄傲!"; // MD5加密 printBase64(encryptionMD5(source)); // SHA加密 printBase64(encryptionSHA(source)); // HMAC加密 printBase64(encryptionHMAC(source)); } static void printBase64(byte[] out) throws Exception { System.out.println(encodeBase64(out)); } /** * MD5加密 * @param source * @return * @throws Exception */ static byte[] encryptionMD5(String source) throws Exception { MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5); md.update(source.getBytes("UTF-8")); return md.digest(); } /** * SHA加密 * @param source * @return * @throws Exception */ static byte[] encryptionSHA(String source) throws Exception { MessageDigest md = MessageDigest.getInstance(ALGORITHM_SHA); md.update(source.getBytes("UTF-8")); return md.digest(); } /** * HMAC加密 * @return * @throws Exception */ static byte[] encryptionHMAC(String source) throws Exception { SecretKey secretKey = new SecretKeySpec(MAC_KEY.getBytes("UTF-8"), ALGORITHM_MAC); Mac mac = Mac.getInstance(ALGORITHM_MAC); mac.init(secretKey); mac.update(source.getBytes("UTF-8")); return mac.doFinal(); } /** * base64编码 * @param source * @return * @throws Exception */ static String encodeBase64(byte[] source) throws Exception{ return new String(Base64.encodeBase64(source), "UTF-8"); } }
1cNbZhnhFsFV3BFPLA71wA== kl5KI61Xq44E/SzSPa2sUntMAEc= JF2v/u9td5l8yGAImNvTZw==
以上是Java 詳解單向加密-MD5、SHA及HMAC及簡單實作範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!