成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JAVA加密算法(2)- 消息摘要算法(MD5、SHA、HMAC)

lemon / 3083人閱讀

摘要:消息摘要的概念對消息通過一個單向算法進行計算,得到一個唯一的結(jié)果。每個消息對應(yīng)一個唯一結(jié)果,所有結(jié)果的長度固定。消息摘要的分類消息摘要算法安全散列算法消息認證碼算法,結(jié)合了和的優(yōu)勢,同時用密鑰對摘要進行加密,是一種更為安全的消息摘要算法。

消息摘要的概念

對消息通過一個單向Hash算法進行計算,得到一個唯一的結(jié)果。每個消息對應(yīng)一個唯一結(jié)果,所有結(jié)果的長度固定。

消息摘要的分類

(1)MD5(Message Digest)消息摘要算法
(2)SHA(Secure Hash Algorithm)安全散列算法
(3)MAC(Message Authentication Code)消息認證碼算法,結(jié)合了MD5和SHA的優(yōu)勢,同時用密鑰對摘要進行加密,是一種更為安全的消息摘要算法。

日常應(yīng)用

校驗數(shù)據(jù)的完整性,防止在傳輸途中被篡改

編程使用
import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class MessageDigestUtil {

  /**
   * 計算MD5值
   */
  public static String encryptMD5(byte[] data) throws Exception {
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");//MD5,MD2
    messageDigest.update(data);
    return BytesToHex.fromBytesToHex(messageDigest.digest());
  }

  /**
   * 計算文件的MD5值(指紋簽名)
   */
  public static String getFileMD5(String path) throws Exception {
    FileInputStream fis = new FileInputStream(new File(path));
    DigestInputStream dis = new DigestInputStream(fis, MessageDigest.getInstance("MD5"));
    try {
      byte[] buffer = new byte[1024];
      int read = dis.read(buffer, 0, 1024);
      while (read != -1) {
        read = dis.read(buffer, 0, 1024);
      }
      MessageDigest md = dis.getMessageDigest();
      return BytesToHex.fromBytesToHex(md.digest());
    } finally {
      dis.close();
      fis.close();
    }

  }

  /**
   * 計算SHA值
   */
  public static String encryptSHA(byte[] data) throws Exception {
    MessageDigest messageDigest = MessageDigest.getInstance("SHA");//SHA,SHA1,SHA-1,SHA-256,SHA-384,SHA-512
    messageDigest.update(data);
    return BytesToHex.fromBytesToHex(messageDigest.digest());
  }

  /**
   * 初始化HMAC密鑰
   */
  public static byte[] initHmacKey() throws Exception {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512");//HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512
    return keyGenerator.generateKey().getEncoded();
  }

  /**
   * 使用Hmac生成的密鑰對數(shù)據(jù)進行加密
   */
  public static String encryptHmac(byte[] data, byte[] key) throws Exception {
    SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");
    Mac mac = Mac.getInstance("HmacSHA512");
    mac.init(secretKey);
    return BytesToHex.fromBytesToHex(mac.doFinal(data));
  }

  public static void main(String[] args) throws Exception {
    String data = "123456";
    String path = "/Users/admin/Downloads/httpd-2.4.20.tar.gz";
    
    System.out.println(data + " 的MD5值: " + MessageDigestUtil.encryptMD5(data.getBytes()));
    System.out.println(path + " 的文件MD5簽名: " + MessageDigestUtil.getFileMD5(path));
    System.out.println(data + " 的SHA值: " + MessageDigestUtil.encryptSHA(data.getBytes()));

    byte[] hmacKey = initHmacKey();
    System.out.println("初始化Hmac密鑰:" + BytesToHex.fromBytesToHex(hmacKey));
    System.out.println(data + " 是的Hmac加密值為: " + MessageDigestUtil.encryptHmac(data.getBytes(), hmacKey));
  }

}
字節(jié)碼數(shù)組轉(zhuǎn)成16進制字符串工具類
public class BytesToHex {
    
    public static String fromBytesToHex(byte[] resultBytes) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < resultBytes.length; i++) {
            if (Integer.toHexString(0xFF & resultBytes[i]).length() == 1) {
                builder.append("0").append(
                        Integer.toHexString(0xFF & resultBytes[i]));
            } else {
                builder.append(Integer.toHexString(0xFF & resultBytes[i]));
            }
        }
        return builder.toString();
    }

}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65200.html

相關(guān)文章

  • 慕課網(wǎng)_《Java實現(xiàn)消息摘要算法加密》學(xué)習(xí)總結(jié)

    時間:2017年4月10日星期一說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:概述 1-1 Java實現(xiàn)消息摘要算法加密 消息摘要算法 MD(Message Digest) SHA(Secure H...

    zengdongbao 評論0 收藏0
  • Nodejs進階:crypto模塊中你需要掌握的安全基礎(chǔ)知識

    摘要:加解密偽代碼加密解密非對稱加密又稱公開秘鑰加密。常見的非對稱加密算法。通常來說對稱加密速度要快于非對稱加密。在之后的通訊階段,可以使用對稱加密算法對數(shù)據(jù)進行加密,秘鑰則是握手階段生成的。確認信息完整未被篡改。 一、 文章概述 互聯(lián)網(wǎng)時代,網(wǎng)絡(luò)上的數(shù)據(jù)量每天都在以驚人的速度增長。同時,各類網(wǎng)絡(luò)安全問題層出不窮。在信息安全重要性日益凸顯的今天,作為一名開發(fā)者,需要加強對安全的認識,并通過技...

    xzavier 評論0 收藏0
  • 加密解密算法介紹

    摘要:加密解密算法介紹算法目前常見有加密算法,散列算法,編碼算法,使用位關(guān)鍵字作為流加密算法加密技術(shù)通常分為兩大類對稱式和非對稱式。對稱性加密算法有用途對稱加密算法用來對敏感數(shù)據(jù)等信息進行加密數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場合。 加密解密算法介紹 算法目前常見有: 加密算法,散列算法,Base64(編碼算法),https(SSL使用40位關(guān)鍵字作為RC4流加密算法) 加密技術(shù)通...

    ThinkSNS 評論0 收藏0
  • Android 應(yīng)用安全開發(fā)之淺談加密算法的坑

    摘要:還有很多開發(fā)者沒有意識到的加密算法的問題。不要使用哈希函數(shù)做為對稱加密算法的簽名。開發(fā)者建議使用基于口令的加密算法時,生成密鑰時要加鹽,鹽的取值最好來自,并指定迭代次數(shù)。不要使用沒有消息認證的加密算法加密消息,無法防重放。 本文作者:阿里移動安全@伊樵,@舟海 Android開發(fā)中,難免會遇到需要加解密一些數(shù)據(jù)內(nèi)容存到本地文件、或者通過網(wǎng)絡(luò)傳輸?shù)狡渌?wù)器和設(shè)備的問題,但并不是使用了加...

    不知名網(wǎng)友 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<