常用的消息摘要算法小总结

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 今天偶然的学习了一下几种关于消息摘要算法的知识。个人觉得很好。应着老话“好记性不如烂笔头”,我就码了几行代码咯。算法嘛,没什么好说的了。毕竟是设计者智慧与汗水的结晶,也是时代进步的推动力。

今天偶然的学习了一下几种关于消息摘要算法的知识。个人觉得很好。应着老话“好记性不如烂笔头”,我就码了几行代码咯。


算法嘛,没什么好说的了。毕竟是设计者智慧与汗水的结晶,也是时代进步的推动力。我们能做的就是将这种算法运用得当,造福全人类,就行了!

//格外需要注意的是采用CC(Commons codec)方式生成消息摘要时,一定要记得导入相关的jar包哦!

MD方式


package MD;
/**
 * MD:MessageDigest----消息摘要算法
 */

import java.security.MessageDigest;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.digest.Md5Crypt;
import org.junit.Test;

/**
 * 简单的使用MessageDigest实现消息摘要的小案例
 * 收获:
 *      使用摘要算法获得字节数组无法直接输出,需要转成相应的十六进制才能获得结果
 * @author Summer
 *
 */
public class Demo {

    private static String targetString = "I am Summer!";

    /**
     * 测试MD5算法加密效果,转成了十六进制
     * JDK实现
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte [] bytes = md.digest(targetString.getBytes());
        String result = Hex.encodeHexString(bytes);
        System.out.println("MD5加密后的串是:"+result);
        //5b704caf20c179cdf61d7121e59dcd76
    }

    /**
     * 测试MD2算法加密效果,转成了十六进制
     * JDK实现
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD2");
        byte [] bytes = md.digest(targetString.getBytes());
        String result = Hex.encodeHexString(bytes);
        System.out.println("MD5加密后的串是:"+result);
        //387992acc0a756abc7026d635383b0a7
    }

    /**
     * 测试MD2算法加密效果,不转成十六进制
     * JDK实现
     * @throws Exception
     */
    @Test
    public void test3() throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD2");
        byte [] bytes = md.digest(targetString.getBytes());
        System.out.println(bytes);
    }


    /**
     * 测试MD5算法加密效果,不转成十六进制
     * JDK实现
     * @throws Exception
     */
    @Test
    public void test4() throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte [] bytes = md.digest(targetString.getBytes());
        System.out.println(bytes.toString());
    }

    /**
     * 使用commons codec的方式对目标字符串进行加密MD2,并使用十六进制进行输出
     * @throws Exception
     */
    @Test
    public void test5() throws Exception {
        MessageDigest md = DigestUtils.getMd2Digest();
        byte[] bytes = md.digest(targetString.getBytes());
        String result = Hex.encodeHexString(bytes);
        System.out.println("Commons codec 方式加密MD2:"+ result);
        //387992acc0a756abc7026d635383b0a7
    }


    /**
     * 使用commons codec的方式对目标字符串进行加密MD5,并使用十六进制进行输出
     * 对比方法发现,使用CC这个开源方式,可以大大的简化操作。但其底层仍是JDK实现的,cc知识做了一些简化,仅此而已
     * @throws Exception
     */
    @Test
    public void test6() throws Exception {
        MessageDigest md = DigestUtils.getMd5Digest();
        byte[] bytes = md.digest(targetString.getBytes());
        String result = Hex.encodeHexString(bytes);
        System.out.println("Commons codec 方式加密MD5:"+ result);
        //5b704caf20c179cdf61d7121e59dcd76
        System.out.println(DigestUtils.md5Hex(targetString));
        //5b704caf20c179cdf61d7121e59dcd76
    }

}

SHA方式


package SHA;
/**
 * SHA: Security Hash Algorithm -----安全哈希算法
 */

import java.security.MessageDigest;

import org.apache.commons.codec.binary.Hex;
import org.junit.Test;

public class Demo {

    private static String targetString = "I am Summer!";


    /**
     * 使用JDK方式以SHA1的方式实现消息摘要算法
     * @throws Exception
     */
    @Test
    public void testSHA1() throws Exception {

        /*方式一:
         * //算法名称对于SHA1方式:  可以是SHA也可以是SHA1
            MessageDigest md = MessageDigest.getInstance("SHA");
            byte[] bytes = md.digest(targetString.getBytes());
            String result = Hex.encodeHexString(bytes);
            System.out.println("JDK 方式实现SHA1消息摘要的加密:\t"+ result);
            //a621ca634410c2521ef560736a6a9da048f42961
         */     

        /*
         * 方式二:
         */
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(targetString.getBytes());
        String result = Hex.encodeHexString(md.digest());
        System.out.println(result);

    }


    /**
     * 使用JDK方式以SHA-224的方式实现消息摘要算法
     * @throws Exception
     */
    @Test
    public void testSHA224() throws Exception {

        MessageDigest md = MessageDigest.getInstance("SHA-224");
        md.update(targetString.getBytes());
        String result = Hex.encodeHexString(md.digest());
        System.out.println(result);
        //6fb07533ef05a1f1b6a0fbd25f08ed3cbcf17807a507c0224756f06d

    }


    /**
     * 使用JDK方式以SHA-384的方式实现消息摘要算法
     * @throws Exception
     */
    @Test
    public void testSHA384() throws Exception {

        MessageDigest md = MessageDigest.getInstance("SHA-384");
        md.update(targetString.getBytes());
        String result = Hex.encodeHexString(md.digest());
        System.out.println(result);
        //c640d1c73a8e2078b290f284fce59da103ecfc1c3c9442cc90ebd5f08900d8e6f19551da7b2f213d96dd055bd2759698

    }


    /**
     * 使用JDK方式以SHA-256的方式实现消息摘要算法
     * @throws Exception
     */
    @Test
    public void testSHA256() throws Exception {

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(targetString.getBytes());
        String result = Hex.encodeHexString(md.digest());
        System.out.println(result);
        //8305809696717b31c6765b7ba89cfd67c17ef62c79a700ae4e305fee5ebdf457

    }


    /**
     * 使用JDK方式以SHA-512的方式实现消息摘要算法
     * @throws Exception
     */
    @Test
    public void testSHA512() throws Exception {

        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(targetString.getBytes());
        String result = Hex.encodeHexString(md.digest());
        System.out.println(result);
        //520abdfdc5e0ac43c795bee9da1cac3fa2f55b8e89f1d33f9a4b83367f4b74cd5d42bfa2c6d4f68c362e64d44ea664244c03c7fd2b7bc167a489fe7129c91156

    }

}

MAC方式


package MAC;

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

import org.apache.commons.codec.binary.Hex;
import org.junit.Test;

/**
 * MAC: Message Authentication Code ------消息验证码
 */

public class Demo {

    private static String targetString = "I am Summer!";

    /**
     * 使用MAC算法以MD5方式加密
     * @throws Exception
     */
    @Test
    public void hmacMD5() throws Exception {
        //初始化KeyGeerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
        //产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        //获得密钥
        byte[] key = secretKey.getEncoded();

        key = Hex.decodeHex(new char[]{'S','u','m','m','e','r','!'});


        //还原密钥
        SecretKey restoreSecretKey = new SecretKeySpec(key, "HmacMD5");
        //实例化Mac
        Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());
        //初始化Mac
        mac.init(restoreSecretKey);
        byte[] hmacMD5Bytes = mac.doFinal(targetString.getBytes());
        //转成十六进制并进行输出
        String result = Hex.encodeHexString(hmacMD5Bytes);
        System.out.println(result);
        //8371828a9e53f04977b4d2ceb73ff506
    }


}

小总结


对于MAC方式,其原理其实和前两个差不多,只不过是加入了key加密的权限。详见代码哦!

目录
相关文章
|
2月前
|
算法 数据安全/隐私保护 C++
超级好用的C++实用库之MD5信息摘要算法
超级好用的C++实用库之MD5信息摘要算法
69 0
|
3月前
|
算法 JavaScript 前端开发
消息摘要算法:MD5加密
消息摘要算法:MD5加密
60 1
|
4月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
6月前
|
存储 算法 安全
软件体系结构 - 摘要算法
软件体系结构 - 摘要算法
38 0
|
6月前
|
算法 JavaScript 前端开发
JavaScript学习 --消息摘要算法
JavaScript学习 --消息摘要算法
73 0
|
6月前
|
算法 安全 C#
C# | 上位机开发新手指南(六)摘要算法
你知道摘要算法么?它在保障数据安全方面非常有用! 它能够将任意长度的数据转换成固定长度的消息摘要,从而确保数据的完整性和可靠性。比如说,我们下载软件的时候,就可以用摘要算法来检验软件是否被篡改,保障我们的电脑安全。 那这个算法的工作原理是怎样的呢?大致就是通过一系列复杂的计算,将原始数据转换为一个固定长度的摘要信息。而且无论输入的数据大小,输出的摘要信息长度都是一样的。 那么摘要算法有什么用处呢?比如数字签名,确保数据的来源和内容没有被篡改。还有密码学等领域的应用,可以说是非常厉害了!
73 0
C# | 上位机开发新手指南(六)摘要算法
|
算法 JavaScript 前端开发
JavaScript学习 --消息摘要算法
JavaScript学习 --消息摘要算法
72 0
|
算法 安全 Java
快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底
加密算法通常被分为两种:对称加密和非对称加密。其中,对称加密算法在加密和解密时使用的密钥相同;非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是对数据进行摘要并且不可逆的算法。 这次我们了解一下消息摘要算法。
637 0
快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底
|
存储 算法 数据库
MD5工具类(信息摘要算法)
MD5工具类(信息摘要算法)
122 0
|
算法 安全 编译器
MD5 消息摘要算法
MD5 算法是 MD4 消息摘要算法的扩展。MD5 比 MD4 稍慢,但在设计上更“保守”。MD5 的设计是因为人们认为 MD4 的使用速度可能比现有的批判性审查所证明的要快;由于 MD4 的设计速度非常快,因此就成功进行密码分析攻击的风险而言,它处于“边缘”。MD5 稍有后退,稍微降低速度以获得更大的最终安全性。它包含了不同评论者提出的一些建议,并包含额外的优化。MD5 算法正被置于公共领域以供审查并可能作为标准采用。
313 0
MD5 消息摘要算法
下一篇
无影云桌面