3-消息摘要

本系列文章主要总结了常用的Java加解密技术。本文介绍消息摘要,包括MD、SHA和MAC,消息摘要是一种不可逆的过程,常用于文件完整性校验。

MD算法

MD(Message Digest,消息摘要算法)是一种最常见的消息摘要算法,有MD2、MD3、MD4和MD5,其中又属MD5最为常见。MD系列的消息摘要算法生成128位的摘要数据(16个字节,Hex编码为32个字符)。

使用Java实现

Java本身提供了MD5的实现,示例代码如下,JDK版本是由于JDK没有提供进制转换,所以需要自己实现进制转换。

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5TestJdk {
    public static void main(String[] args) 
            throws NoSuchAlgorithmException, 
            UnsupportedEncodingException {
        byte[] data = "www.hiwzc.com".getBytes("UTF-8");
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(data);
        byte[] digest = md.digest();
        System.out.println(toHexString(digest));
    }
    
    private static String toHexString(byte[] data) {
        String table = "0123456789abcdef";
        StringBuilder sb = new StringBuilder();
        final int l = data.length;
        for (int i = 0; i < l; i++) {
            sb.append(table.charAt((0xF0 & data[i]) >>> 4));
            sb.append(table.charAt(0x0F & data[i]));
        }
        return sb.toString();
    }
}

使用Bouncy Castle实现

下面的代码使用开源软件Bouncy Castle实现MD5消息摘要,使用的版本是1.56。有两种实现方式,一种是将Bouncy Castle的Provider提供给Java的JCA框架,另一种是使用Bouncy Castle自己的API。


import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
public class MD5TestBC {
    public static void main(String[] args)
            throws UnsupportedEncodingException, NoSuchAlgorithmException {
        // 使用JCA框架
        byte[] data = "www.hiwzc.com".getBytes("UTF-8");
        MessageDigest md = MessageDigest.getInstance("MD5",
                new BouncyCastleProvider());
        md.update(data);
        byte[] digest = md.digest();
        System.out.println(Hex.toHexString(digest));
        // 使用Bouncy Castle的API
        Digest md5 = new MD5Digest();
        md5.update(data, 0, data.length);
        byte[] digest2 = new byte[md5.getDigestSize()];
        md5.doFinal(digest2, 0);
        System.out.println(Hex.toHexString(digest2));
    }
}

使用Apache Commons Codec实现

下面的代码使用开源软件Apache Commons Codec实现MD5消息摘要,使用的版本是1.10。与Bouncy Castle不同,Apache Commons Code不是一个JCA的Provider,而是封装了Java的实现。

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.digest.DigestUtils;
public class MD5TestCC {
    public static void main(String[] args)
            throws UnsupportedEncodingException,
                NoSuchAlgorithmException {
        byte[] data = "www.hiwzc.com".getBytes("UTF-8");
        String md5 = DigestUtils.md5Hex(data);
        System.out.println(md5);
    }
}

SHA算法

SHA(Secure Hash Algorithm,安全散列算法)是在MD4基础上发展起来的新一代消息摘要算法,SHA生成的摘要信息比MD5更长,安全性更高。目前SHA算法有SHA-1、SHA-224、SHA-256、SHA-384、SHA-512。SHA-1生成的消息摘要长度为160位(20个字节,Hex编码为40个字符),其他的长度和名称一致,比如SHA-256的摘要长度为256位(32个字节,Hex编码为64个字符)。

得益于Java提供的JCA框架,SHA256的实现和MD5的实现基本一致,比如SUN实现SHA-256只要把MD5实现的MessageDigest.getInstance("MD5")改为MessageDigest.getInstance("SHA-256")即可。下面看看Bouncy Castle和Apache Comons Codec的实现。

使用Bouncy Castle实现

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
public class Sha256TestBC {
    public static void main(String[] args)
            throws UnsupportedEncodingException,
            NoSuchAlgorithmException {
        // 使用JCA框架
        byte[] data = "www.hiwzc.com".getBytes("UTF-8");
        MessageDigest md = MessageDigest.getInstance("SHA-256",
                new BouncyCastleProvider());
        md.update(data);
        byte[] digest = md.digest();
        System.out.println(Hex.toHexString(digest));
        // 使用Bouncy Castle的API
        Digest sha256 = new SHA256Digest();
        sha256.update(data, 0, data.length);
        byte[] digest2 = new byte[sha256.getDigestSize()];
        sha256.doFinal(digest2, 0);
        System.out.println(Hex.toHexString(digest2));
    }
}

使用Apache Commons Codec实现


import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.digest.DigestUtils;
public class Sha256TestCC {
    public static void main(String[] args)
            throws UnsupportedEncodingException,
                NoSuchAlgorithmException {
        byte[] data = "www.hiwzc.com".getBytes("UTF-8");
        String md5 = DigestUtils.sha256Hex(data);
        System.out.println(md5);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,889评论 0 6
  • 在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私安全信息时,开发者自然会想到对其进行加密,即使...
    闲庭阅读 3,361评论 0 11
  • 今天是爷爷去世后的第五天,也是爷爷出殡的日子。我和弟弟捧着爷爷和奶奶的画像,走在去坟地的路上,一边走一边回...
    林夕日生阅读 646评论 1 0
  • 2015年12月份,拿到人生的第一笔工资,买了一个Kindle送给自己。拿到了朋友给留的纪念币和纪念钞,放假回家,...
    芹枣嫚阅读 162评论 1 1