3-消息摘要

本系列文章主要總結(jié)了常用的Java加解密技術(shù)。本文介紹消息摘要,包括MD、SHA和MAC,消息摘要是一種不可逆的過程,常用于文件完整性校驗。

MD算法

MD(Message Digest,消息摘要算法)是一種最常見的消息摘要算法,有MD2、MD3、MD4和MD5,其中又屬MD5最為常見。MD系列的消息摘要算法生成128位的摘要數(shù)據(jù)(16個字節(jié),Hex編碼為32個字符)。

使用Java實現(xiàn)

Java本身提供了MD5的實現(xiàn),示例代碼如下,JDK版本是由于JDK沒有提供進制轉(zhuǎn)換,所以需要自己實現(xiàn)進制轉(zhuǎn)換。

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實現(xiàn)

下面的代碼使用開源軟件Bouncy Castle實現(xiàn)MD5消息摘要,使用的版本是1.56。有兩種實現(xiàn)方式,一種是將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實現(xiàn)

下面的代碼使用開源軟件Apache Commons Codec實現(xiàn)MD5消息摘要,使用的版本是1.10。與Bouncy Castle不同,Apache Commons Code不是一個JCA的Provider,而是封裝了Java的實現(xiàn)。

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基礎(chǔ)上發(fā)展起來的新一代消息摘要算法,SHA生成的摘要信息比MD5更長,安全性更高。目前SHA算法有SHA-1、SHA-224、SHA-256、SHA-384、SHA-512。SHA-1生成的消息摘要長度為160位(20個字節(jié),Hex編碼為40個字符),其他的長度和名稱一致,比如SHA-256的摘要長度為256位(32個字節(jié),Hex編碼為64個字符)。

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

使用Bouncy Castle實現(xiàn)

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實現(xiàn)


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);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發(fā)過程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 3,039評論 0 6
  • 在開發(fā)應用過程中,客戶端與服務端經(jīng)常需要進行數(shù)據(jù)傳輸,涉及到重要隱私安全信息時,開發(fā)者自然會想到對其進行加密,即使...
    閑庭閱讀 3,433評論 0 11
  • 今天是爺爺去世后的第五天,也是爺爺出殯的日子。我和弟弟捧著爺爺和奶奶的畫像,走在去墳地的路上,一邊走一邊回...
    林夕日生閱讀 741評論 1 0
  • 2015年12月份,拿到人生的第一筆工資,買了一個Kindle送給自己。拿到了朋友給留的紀念幣和紀念鈔,放假回家,...
    芹棗嫚閱讀 193評論 1 1

友情鏈接更多精彩內(nèi)容