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

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



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

//格外需要注意的是采用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加密的权限。详见代码哦!

时间: 2024-10-07 13:13:44

常用的消息摘要算法小总结的相关文章

Python和GO语言实现的消息摘要算法示例_python

常用的消息摘要算法有MD5和SHA,这些算法在python和go的库中都有,需要时候调用下就OK了,这里总结下python和go的实现. 一.python消息摘要示例 代码如下: 复制代码 代码如下: #! /usr/bin/python '''       File      : testHash.py       Author    : Mike       E-Mail    : Mike_Zhang@live.com ''' import hashlib src = raw_input(

消息摘要算法-SHA算法实现

简述 SHA算法分为一代和二代,这个是美国安全局发布的一系列的密码散列算法. 基于如下两点安全理由: 1.从消息摘要反推输入信息,从计算理论上来说很困难 2.想找到两组不同的消息对应到相应的消息摘要,从计算理论上来说一额很困难.对任何消息的变动,都有很高几率产生消息摘要迥异   不过这个算法已经不安全了,被中国的教授破解了.这个技术通常用来做数字签名.常见的就是B2B,B2C网站的支付.数据post到支付中心的时候,是发送一些加密串,同时带上签名.而这个签名可以被伪造.所以就不安全了.   常见

PHP网站开发中常用的8个小技巧

 这篇文章主要介绍了PHP网站开发中常用的8个小技巧,本文讲解了命名.使用.PHP判断Form表单是否提交.PHP 获取字符串长度.PHP超全局对象等内容,需要的朋友可以参考下     PHP是一种用于创建动态WEB页面的服务端脚本语言.如同ASP和ColdFusion,用户可以混合使用PHP和HTML编写WEB页面,当访 问者浏览到该页面时,服务端会首先对页面中的PHP命令进行处理,然后把处理后的结果连同HTML内容一起传送到访问端的浏览器.但是与ASP或 ColdFusion不同,PHP是一

Photoshop快捷键常用却鲜为人知的小Tips

  下面这篇教程是向PS学习者分享Photoshop快捷键常用却鲜为人知的小Tips,教程很实用,对于正在学习PS朋友很有帮助,一起来学习吧!   教程完!以上就是Photoshop快捷键常用却鲜为人知的小Tips,希望能对大家有所帮助! 分类: PS入门教程

消息摘要算法-bouncy castle支持的MD4算法扩展

sun本身支持MD2和MD5,但是缺少进制转换与支持   bouncy castle对sun进行支持补充,提供了对MD4的算法,同时对十六进制转换提供了支持.   commons codec 只是针对MD5支持,并且支持16进制   但是大部分场景下我们都是使用MD5,毕竟MD5是经过MD4改良进来了.不过也有场景可能会用到MD4.那我们就将MD4消息摘要处理的代码展示下: package com.ca.test; import java.security.MessageDigest; impo

PHP网站开发中常用的8个小技巧_php实例

PHP是一种用于创建动态WEB页面的服务端脚本语言.如同ASP和ColdFusion,用户可以混合使用PHP和HTML编写WEB页面,当访 问者浏览到该页面时,服务端会首先对页面中的PHP命令进行处理,然后把处理后的结果连同HTML内容一起传送到访问端的浏览器.但是与ASP或 ColdFusion不同,PHP是一种源代码开放程序,拥有很好的跨平台兼容性.用户可以在Windows NT系统以及许多版本的Unix系统上运行PHP,而且可以将PHP作为Apache服务器的内置模块或CGI程序运行. 本

消息摘要算法-MAC算法系列

一.简述   mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMAC算法.关于hmac算法的详情可以参看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),这里包含了HmacMD5算法的C语言实现.   这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同.例如

jquery常用的12个小功能_jquery

jquery12个常用功能极好的,快来围观! 返回顶部使用JQuery的animate和scrollTop方法可以创建简单地返回顶部的动画: // Back to top $('a.top').click(function (e) { e.preventDefault(); $(document.body).animate({scrollTop: 0}, 800); }); HTML中得有一个按钮: <!-- Create an anchor tag --> <a class="

网站优化过程当中常用的常用的五种小技巧分享

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站优化是一个漫长而艰巨的工作,我们需要有一颗坚持不懈的心态面对每天的优化工作,我们需要切忌的且忌讳的:心血来潮就努力做事,不想工作就给自己放假休息,这样的网站没有规律的更新,一方面在搜索引擎来说,不会有很高的信任度,当然也不会有很好的排名,另方面对于竞争对手来说,你在休息的时候你的竞争对手却是再辛苦的优化,网站排名是个千军万马过独木桥的残酷