文档章节

验证数据完整性——消息摘要算法

blackfoxMa
 blackfoxMa
发布于 04/19 22:41
字数 3926
阅读 0
收藏 0

消息摘要算法包含MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息认证码算法)共3大系列,常用于验证数据的完整性,是数字签名算法的核心算法。

消息摘要算法又称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可通过该散列值反推原始信息。这是消息摘要算法的安全性的根本所在。

MD算法的使用

Sun中支持MD2和MD5算法,Bouncy Castle还支持MD4算法,Commons Codec的DigestUtils是对Sun提供的MessageDigest的一次封装,实现了MD5和SHA系列消息摘要算法的实现。

算法 摘要长度 备注
MD2 128 JAVA
MD5 同上 JAVA
MD4 ... BC

下面示例演示了MD5的处理。另外,对消息做MD5Hex处理后,得到的摘要值都是32位的十六进制字符串。

import org.apache.commons.codec.digest.DigestUtils;

public abstract class MD5Coder {

    /**
     * MD5加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeMD5(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.md5(data);
    }

    /**
     * MD5加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static String encodeMD5Hex(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.md5Hex(data);
    }
}

用于校验文件的MD5值示例:
文件为 mysql-essential-5.1.38-win32.msi,存放于D盘根目录,MD5值为5a077abefee447cbb271e2aa7f6d5a47。

public class MD5Test {

    /**
     * 验证文件的MD5值
     * 
     * @throws Exception
     */
    @Test
    public void testByMessageDigest() throws Exception {
        // 文件路径
        String path = "D:\\mysql-essential-5.1.38-win32.msi";

        // 构建文件输入流
        FileInputStream fis = new FileInputStream(new File(path));

        // 初始化MessageDigest,并指定MD5算法
        DigestInputStream dis = new DigestInputStream(fis, MessageDigest
                .getInstance("MD5"));

        // 流缓冲大小
        int buf = 1024;

        // 缓冲字节数组
        byte[] buffer = new byte[buf];

        // 当读到值大于-1就继续读
        int read = dis.read(buffer, 0, buf);

        while (read > -1) {
            read = dis.read(buffer, 0, buf);
        }

        // 关闭流
        dis.close();

        // 获得MessageDigest
        MessageDigest md = dis.getMessageDigest();

        // 摘要处理
        byte[] b = md.digest();

        // 十六进制转换
        String md5hex = Hex.encodeHexString(b);

        // 验证
        assertEquals(md5hex, "5a077abefee447cbb271e2aa7f6d5a47");
    }

    /**
     * 验证文件的MD5值
     * 
     * @throws Exception
     */
    @Test
    public void testByDigestUtils() throws Exception {
        // 文件路径
        String path = "D:\\mysql-essential-5.1.38-win32.msi";

        // 构建文件输入流
        FileInputStream fis = new FileInputStream(new File(path));

        // 使用DigestUtils做MD5Hex处理
        String md5hex = DigestUtils.md5Hex(fis);

        // 关闭流
        fis.close();

        // 验证
        assertEquals(md5hex, "5a077abefee447cbb271e2aa7f6d5a47");
    }

}

SHA算法的使用

SHA算法,由美国国家安全局(NSA)设计,基于MD4算法基础演变而来,摘要的长度更长,安全性更高。

基于MD/SHA算法的消息传递

SHA家族共有SHA-1、SHA-224、SHA-256、SHA-384和SHA-512五种算法。Sun提供了SHA-1、SHA-256、SHA-384和SHA-512四种,且缺少对应的进制转换实现;Bouncy Castle提供了对SHA-224的支持;Commons Codec则是Sun的一个包装。后两者都支持多种形式的参数,支持十六进制字符串形式的摘要信息。

算法 摘要长度 备注
SHA-1 160 JAVA
SHA-256 256 JAVA
SHA-384 384 JAVA
SHA-512 512 JAVA
SHA-224 224 BC
import java.security.MessageDigest;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
import org.apache.commons.codec.digest.DigestUtils;

public abstract class SHACoder {

    /**
     * SHA加密
     * 
     * @param data 待加密数据
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeSHA(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha(data);
    }

    /**
     * SHAHex加密
     * 
     * @param data 待加密数据
     * @return String 消息摘要
     * @throws Exception
     */
    public static String encodeSHAHex(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.shaHex(data);
    }

    /**
     * SHA-224加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeSHA224(byte[] data) throws Exception {
        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("SHA-224");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * SHA-224加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static String encodeSHA224Hex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeSHA224(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));

    }

    /**
     * SHA256加密
     * 
     * @param data 待加密数据
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeSHA256(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha256(data);
    }

    /**
     * SHA256Hex加密
     * 
     * @param data 待加密数据
     * @return String 消息摘要
     * @throws Exception
     */
    public static String encodeSHA256Hex(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha256Hex(data);
    }

    /**
     * SHA384加密
     * 
     * @param data 待加密数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static byte[] encodeSHA384(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha384(data);
    }

    /**
     * SHA384Hex加密
     * 
     * @param data 待加密数据
     * @return String 消息摘要 
     * @throws Exception
     */
    public static String encodeSHA384Hex(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha384Hex(data);
    }

    /**
     * SHA512Hex加密
     * 
     * @param data 待加密数据
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeSHA512(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha512(data);
    }

    /**
     * SHA512Hex加密
     * 
     * @param data 待加密数据
     * @return String 消息摘要
     * @throws Exception
     */
    public static String encodeSHA512Hex(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.sha512Hex(data);
    }

}

MAC算法的处理

MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。因此,也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。

基于MAC算法的消息传递模型

MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列算法有HmacMD2、HmacMD4和HmacMD5三种;SHA系列算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384和HmacSHA512五种算算法。

Sun提供了基本算法支持,如HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512五种;而Bouncy Castle则增加了对HmacMD2、HmacMD4和HmacSHA224三种算法的支持,同时支持十六进制编码。

算法 摘要长度 备注
HmacMD5 128 JAVA6实现
HmacSHA1 160 JAVA6实现
HmacSHA256 256 JAVA6实现
HmacSHA384 384 JAVA6实现
HmacSHA512 512 JAVA6实现
HmacMD2 128 BouncyCastle实现
HmacMD4 128 BouncyCastle实现
HmacSHA224 224 BouncyCastle实现
import java.security.Security;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

public abstract class MACCoder {

    /**
     * 初始化HmacMD5密钥
     * 
     * @return
     * @throws Exception
     */
    public static byte[] initHmacMD5Key() throws Exception {

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacMD5加密
     * 
     * @param data
     *            待加密数据
     * @param key
     *            密钥
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeHmacMD5(byte[] data, byte[] key)
            throws Exception {

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");

        // 实例化Mac "SslMacMD5"
        Mac mac = Mac.getInstance("SslMacMD5");//secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA1密钥
     * 
     * @return
     * @throws Exception
     */
    public static byte[] initHmacSHAKey() throws Exception {

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HMacTiger");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA1加密
     * 
     * @param data
     *            待加密数据
     * @param key
     *            密钥
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeHmacSHA(byte[] data, byte[] key)
            throws Exception {

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HMacTiger");
 
        // 实例化Mac SslMacMD5
        Mac mac = Mac.getInstance("SslMacMD5");//secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }
    
//  // 根据所安装的 JCE 仲裁策略文件,返回指定转换的最大密钥长度。
//  public final static int getMaxAllowedKeyLength(String transformation) 

    /**
     * 初始化HmacSHA256密钥
     * 
     * @return
     * @throws Exception
     */
    public static byte[] initHmacSHA256Key() throws Exception {

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA256加密
     * 
     * @param data
     *            待加密数据
     * @param key
     *            密钥
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeHmacSHA256(byte[] data, byte[] key)
            throws Exception {

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA256");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA384密钥
     * 
     * @return
     * @throws Exception
     */
    public static byte[] initHmacSHA384Key() throws Exception {

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA384");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA384加密
     * 
     * @param data
     *            待加密数据
     * @param key
     *            密钥
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeHmacSHA384(byte[] data, byte[] key)
            throws Exception {

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA384");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA512密钥
     * 
     * @return
     * @throws Exception
     */
    public static byte[] initHmacSHA512Key() throws Exception {

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA512加密
     * 
     * @param data
     *            待加密数据
     * @param key
     *            密钥
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeHmacSHA512(byte[] data, byte[] key)
            throws Exception {

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacMD2密钥
     * 
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacMD2Key() throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD2");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacMD2消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacMD2(byte[] data, byte[] key)
            throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacMD2");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * HmacMD2Hex消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param String
     *            密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static String encodeHmacMD2Hex(byte[] data, byte[] key)
            throws Exception {

        // 执行消息摘要
        byte[] b = encodeHmacMD2(data, key);

        // 做十六进制转换
        return new String(Hex.encode(b));
    }

    /**
     * 初始化HmacMD4密钥
     * 
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacMD4Key() throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD4");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacMD4消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacMD4(byte[] data, byte[] key)
            throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacMD4");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * HmacMD4Hex消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return String 消息摘要
     * @throws Exception
     */
    public static String encodeHmacMD4Hex(byte[] data, byte[] key)
            throws Exception {

        // 执行消息摘要
        byte[] b = encodeHmacMD4(data, key);

        // 做十六进制转换
        return new String(Hex.encode(b));
    }

    /**
     * 初始化HmacSHA224密钥
     * 
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacSHA224Key() throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA224");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA224消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacSHA224(byte[] data, byte[] key)
            throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA224");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * HmacSHA224Hex消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return String 消息摘要
     * @throws Exception
     */
    public static String encodeHmacSHA224Hex(byte[] data, byte[] key)
            throws Exception {

        // 执行消息摘要
        byte[] b = encodeHmacSHA224(data, key);

        // 做十六进制转换
        return new String(Hex.encode(b));
    }
}

其他消息摘要算法

RipeMD算法,是在MD4、MD5缺陷分析的基础上提出的。共有4个标准,包括RipeMD128、RipeMD160、RipeMD256和RipeMD320。RipeMD和MAC算法融合产生了HmacRipeMD128和HmacRipeMD160。

算法 摘要长度 备注
RipeMD128 128 BouncyCastle实现
RipeMD160 160 BouncyCastle实现
RipeMD256 256 BouncyCastle实现
RipeMD320 320 BouncyCastle实现
HmacRipeMD128 128 BouncyCastle实现
HmacRipeMD160 160 BouncyCastle实现
import java.security.Security;

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

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

public abstract class RipeMDCoder {

    /**
     * RipeMD128消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static byte[] encodeRipeMD128(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("RipeMD128");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * RipeMD128Hex消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static String encodeRipeMD128Hex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeRipeMD128(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }

    /**
     * RipeMD160消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static byte[] encodeRipeMD160(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("RipeMD160");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * RipeMD160Hex消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static String encodeRipeMD160Hex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeRipeMD160(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }

    /**
     * RipeMD256消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static byte[] encodeRipeMD256(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("RipeMD256");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * RipeMD256Hex消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static String encodeRipeMD256Hex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeRipeMD256(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }

    /**
     * RipeMD320消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static byte[] encodeRipeMD320(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("RipeMD320");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * RipeMD320Hex消息摘要
     * 
     * @param data 待做消息摘要处理的数据
     * @return byte[] 消息摘要 
     * @throws Exception
     */
    public static String encodeRipeMD320Hex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeRipeMD320(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }

    /**
     * 初始化HmacRipeMD128密钥
     * 
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacRipeMD128Key() throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacRipeMD128");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacRipeMD128消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacRipeMD128(byte[] data, byte[] key)
            throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacRipeMD128");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * HmacRipeMD128Hex消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param String
     *            密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static String encodeHmacRipeMD128Hex(byte[] data, byte[] key)
            throws Exception {

        // 执行消息摘要
        byte[] b = encodeHmacRipeMD128(data, key);

        // 做十六进制转换
        return new String(Hex.encode(b));
    }

    /**
     * 初始化HmacRipeMD160密钥
     * 
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacRipeMD160Key() throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacRipeMD160");

        // 产生秘密密钥
        SecretKey secretKey = keyGenerator.generateKey();

        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacRipeMD160消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacRipeMD160(byte[] data, byte[] key)
            throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacRipeMD160");

        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());

        // 初始化Mac
        mac.init(secretKey);

        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * HmacRipeMD160Hex消息摘要
     * 
     * @param data
     *            待做消息摘要处理的数据
     * @param byte[] 密钥
     * @return String 消息摘要
     * @throws Exception
     */
    public static String encodeHmacRipeMD160Hex(byte[] data, byte[] key)
            throws Exception {

        // 执行消息摘要
        byte[] b = encodeHmacRipeMD160(data, key);

        // 做十六进制转换
        return new String(Hex.encode(b));
    }

}

Tiger算法,号称最快的HASH算法,专门为64为机器做了优化,其消息摘要长度为192位。

Whirlpool算法,号称最安全的摘要算法,长度512位。

GOST3411算法,长度256位,作者不详。

import java.security.MessageDigest;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

public abstract class MDCoder {

    /**
     * Tiger加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeTiger(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("Tiger");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * TigerHex加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static String encodeTigerHex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeTiger(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }

    /**
     * Whirlpool加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeWhirlpool(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("Whirlpool");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * WhirlpoolHex加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static String encodeWhirlpoolHex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeWhirlpool(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }

    /**
     * GOST3411加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static byte[] encodeGOST3411(byte[] data) throws Exception {

        // 加入BouncyCastleProvider支持
        Security.addProvider(new BouncyCastleProvider());

        // 初始化MessageDigest
        MessageDigest md = MessageDigest.getInstance("GOST3411");

        // 执行消息摘要
        return md.digest(data);
    }

    /**
     * GOST3411Hex加密
     * 
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     * 
     * @throws Exception
     */
    public static String encodeGOST3411Hex(byte[] data) throws Exception {

        // 执行消息摘要
        byte[] b = encodeGOST3411(data);

        // 做十六进制编码处理
        return new String(Hex.encode(b));
    }
}

CRC(Cyclic Redundancy Check,循环冗余校验)算法,并不属于加密算法。 CRC-32是各种压缩算法中最为常见的数据完整性校验算法,而它的变种Adler-32普遍应用于zlib压缩算法中的数据完整性校验。

压缩/解压缩数据传递模型

本文转载自:https://www.jianshu.com/p/2419869e717a

blackfoxMa
粉丝 4
博文 119
码字总数 12181
作品 0
广州
后端工程师
私信 提问
Java数字签名——RSA算法

  数字签名:带有密钥(公钥,私钥)的消息摘要算法。        验证数据的完整性,认证数据的来源,抗否性   OSI参考模型   私钥签名,公钥验证   签名算法:RSA,DSA,ECDSA...

奶berber
2018/01/24
0
0
java加密解密

秘钥 Key,分为对称密钥和非对称密钥 对称秘钥 SecretKey,由KeyGenerator生成 非对 PrivateKey,PublicKey,由KeyPairGenerator生成 KeyFactory(SecretKeyFactory)也可生成秘钥,可以将秘钥...

疯狂的骑士
2015/09/14
104
0
[Java 安全]消息摘要与数字签名

消息摘要 算法简述 定义 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原...

guitar_zp
2016/07/24
0
0
移动开发APK签名知识扫盲

签名的意义 签名主要用于表面开发者的身份和操作权利,在签署APK时,在签署 APK 时,签署工具会将公钥证书附加到 APK。公钥证书充当“指纹”,用于将 APK 关联到开发者。主要用途是在升级应用...

移动开发
2017/12/13
0
0
[区块链] 加密算法——Hash算法(进阶)

  为了为保证存储于区块链中的信息的安全与完整,区块链中使用了包含密码哈希函数和椭圆曲线公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共...

x-knight_勋爵
2018/06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx提供下载apk服务

有时候我们可能需要提供文件或者其他apk下载链接,通过 nginx 配置可以很简单地实现。 server {    listen 80;    server_name download.xxx.com;    root app;    locati...

Jack088
12分钟前
0
0
系统监控-与应用高度耦合的Javamelody监控工具

1. 为什么不使用Javamelody? 与应用高度耦合,需要在项目中配置相关的配置文件和引入对应的依赖jar、能监控的功能有限,主要功能如下: 系统信息 可通过pdf下载监控信息 内存、CPU、磁盘、H...

秋日芒草
12分钟前
1
0
mysql基本语句

好久没用sql了,好多都忘记了,正好昨天做题碰上,今天就回顾一下吧! 0.题目如下(以下适用mysql来解答): 1.数据准备: 在notepad++(当然你可以通过其他方式来编写)中编写sql脚本如下: 2.通...

不最醉不龟归
21分钟前
0
0
前端程序员需要具备的几个软实力,你具备了吗

有很多关于前端程序员的调侃,比如“智商很高情商却很感人,思维缜密,极客,加班严重,没有对象只能new一个……”,虽然不是所有前端程序员都是这样,但这也说明了前端程序员这个群体中存在...

智云编程
22分钟前
0
0
Golang math基本数学函数

三角函数 正弦函数,反正弦函数,双曲正弦,反双曲正弦 func Sin(x float64) float64 func Asin(x float64) float64 func Sinh(x float64) float64 func Asinh(x float64) float64 一次性返回......

Sunki
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部