深入淺析Java中單向加密MD5、SHA和HMAC

深入淺析Java 中單向加密MD5、SHA和HMAC?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)是專業(yè)的平城網(wǎng)站建設(shè)公司,平城接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行平城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例

概要:

MD5、SHA、HMAC這三種加密算法,可謂是非可逆加密,就是不可解密的加密方法。

MD5

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。MD5是輸入不定長度信息,輸出固定長度128-bits的算法。

MD5算法具有以下特點:

1、壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的。
2、容易計算:從原數(shù)據(jù)計算出MD5值很容易。
3、抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
4、強抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。

MD5還廣泛用于操作系統(tǒng)的登陸認證上,如Unix、各類BSD系統(tǒng)登錄密碼、數(shù)字簽名等諸多方面。如在Unix系統(tǒng)中用戶的密碼是以MD5(或其它類似的算法)經(jīng)Hash運算后存儲在文件系統(tǒng)中。當用戶登錄的時候,系統(tǒng)把用戶輸入的密碼進行MD5 Hash運算,然后再去和保存在文件系統(tǒng)中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道。MD5將任意長度的“字節(jié)串”映射為一個128bit的大整數(shù),并且通過該128bit反推原始字符串是非常困難的。

SHA

SHA(Secure Hash Algorithm,安全散列算法),數(shù)字簽名等密碼學(xué)應(yīng)用中重要的工具,被廣泛地應(yīng)用于電子商務(wù)等信息安全領(lǐng)域。雖然SHA與MD5通過碰撞法都被破解了, 但是SHA仍然是公認的安全加密算法,較之MD5更為安全。

SHA所定義的長度

下表中的中繼散列值(internal state)表示對每個數(shù)據(jù)區(qū)塊壓縮散列過后的中繼值(internal hash sum)。

算法輸出散列值長度(bits)中繼散列值長度(bits)數(shù)據(jù)區(qū)塊長度(bits)最大輸入消息長度(bits)一個Word長度(bits)循環(huán)次數(shù)使用到的運算符碰撞攻擊
SHA-0160160512264 − 13280+,and,or,xor,rotl
SHA-1160160512264 − 13280+,and,or,xor,rotl存在263的攻擊
SHA-256/224256/224256512264 − 13264+,and,or,xor,shr,rotr尚未出現(xiàn)
SHA-512/384512/38451210242128 − 16480+,and,or,xor,shr,rotr尚未出現(xiàn)

HMAC

HMAC(Hash Message Authentication Code),散列消息鑒別碼,基于密鑰的Hash算法的認證協(xié)議。消息鑒別碼實現(xiàn)鑒別的原理是,用公開函數(shù)和密鑰產(chǎn)生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數(shù)據(jù)塊,即MAC,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進行鑒別認證等。

深入淺析Java 中單向加密MD5、SHA和HMAC

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> 
   * HmacMD5 
   * HmacSHA1 
   * HmacSHA256 
   * HmacSHA384 
   * HmacSHA512 
   * </pre> 
   */ 
  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"); 
  } 
 
} 

結(jié)果:

1cNbZhnhFsFV3BFPLA71wA== 
kl5KI61Xq44E/SzSPa2sUntMAEc= 
JF2v/u9td5l8yGAImNvTZw== 

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

當前名稱:深入淺析Java中單向加密MD5、SHA和HMAC
文章起源:http://muchs.cn/article48/iehpep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、App開發(fā)定制網(wǎng)站、網(wǎng)站導(dǎo)航用戶體驗、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)