资讯专栏INFORMATION COLUMN

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

lemon / 2932人阅读

摘要:消息摘要的概念对消息通过一个单向算法进行计算,得到一个唯一的结果。每个消息对应一个唯一结果,所有结果的长度固定。消息摘要的分类消息摘要算法安全散列算法消息认证码算法,结合了和的优势,同时用密钥对摘要进行加密,是一种更为安全的消息摘要算法。

消息摘要的概念

对消息通过一个单向Hash算法进行计算,得到一个唯一的结果。每个消息对应一个唯一结果,所有结果的长度固定。

消息摘要的分类

(1)MD5(Message Digest)消息摘要算法
(2)SHA(Secure Hash Algorithm)安全散列算法
(3)MAC(Message Authentication Code)消息认证码算法,结合了MD5和SHA的优势,同时用密钥对摘要进行加密,是一种更为安全的消息摘要算法。

日常应用

校验数据的完整性,防止在传输途中被篡改

编程使用
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生成的密钥对数据进行加密
   */
  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));
  }

}
字节码数组转成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();
    }

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65200.html

相关文章

  • 慕课网_《Java实现消息摘要算法加密》学习总结

    时间:2017年4月10日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 Java实现消息摘要算法加密 消息摘要算法 MD(Message Digest) SHA(Secure H...

    zengdongbao 评论0 收藏0
  • Nodejs进阶:crypto模块中你需要掌握的安全基础知识

    摘要:加解密伪代码加密解密非对称加密又称公开秘钥加密。常见的非对称加密算法。通常来说对称加密速度要快于非对称加密。在之后的通讯阶段,可以使用对称加密算法对数据进行加密,秘钥则是握手阶段生成的。确认信息完整未被篡改。 一、 文章概述 互联网时代,网络上的数据量每天都在以惊人的速度增长。同时,各类网络安全问题层出不穷。在信息安全重要性日益凸显的今天,作为一名开发者,需要加强对安全的认识,并通过技...

    xzavier 评论0 收藏0
  • 加密解密算法介绍

    摘要:加密解密算法介绍算法目前常见有加密算法,散列算法,编码算法,使用位关键字作为流加密算法加密技术通常分为两大类对称式和非对称式。对称性加密算法有用途对称加密算法用来对敏感数据等信息进行加密数据加密标准,速度较快,适用于加密大量数据的场合。 加密解密算法介绍 算法目前常见有: 加密算法,散列算法,Base64(编码算法),https(SSL使用40位关键字作为RC4流加密算法) 加密技术通...

    ThinkSNS 评论0 收藏0
  • Android 应用安全开发之浅谈加密算法的坑

    摘要:还有很多开发者没有意识到的加密算法的问题。不要使用哈希函数做为对称加密算法的签名。开发者建议使用基于口令的加密算法时,生成密钥时要加盐,盐的取值最好来自,并指定迭代次数。不要使用没有消息认证的加密算法加密消息,无法防重放。 本文作者:阿里移动安全@伊樵,@舟海 Android开发中,难免会遇到需要加解密一些数据内容存到本地文件、或者通过网络传输到其他服务器和设备的问题,但并不是使用了加...

    不知名网友 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<