博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三章 消息摘要算法--MD5
阅读量:7232 次
发布时间:2019-06-29

本文共 2474 字,大约阅读时间需要 8 分钟。

注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第6章“验证数据完整性--消息摘要算法”

3.1、消息摘要算法:防止消息在传递过程中被篡改。

原理:任何消息经过消息摘要算法后,都会产生唯一的散列值(即“数据指纹”)(同一段消息无论经过多少次相同的消息摘要算法加密,结果都相同),所以如果消息在传送过程中被修改,那么算出来的数据指纹也与原本的消息算出来的不同了,如果没有被修改,则数据指纹是相同的。

特点:单向性(即只有加密,没有解密)

3.2、MD5(算法已被破解,应用于安全程度要求不高的情况下)

实现方式:

  • Commons Codec(“CC”,最推荐,因为封装了JDK的底层代码,并且提供了二进制字节数组向十六进制转化的方法)
  • JDK(没有提供二进制字节数组向十六进制转化的方法,想要进行转化,需要借助BC)
  • Bouncy Castle(“BC”,不推荐,实现比较复杂)

下边只列出基于CC的工具类代码,至于基于JDK的代码可以参考“《Java加密与解密的艺术(第2版)》”,基于BC的代码可参考“慕课网”

3.2.1、基于CC实现的MD5加密算法

pom.xml

1 
2
3
commons-codec
4
commons-codec
5
1.10
6

工具类

package com.util.md5;import java.io.UnsupportedEncodingException;import java.security.NoSuchAlgorithmException;import org.apache.commons.codec.digest.DigestUtils;/** * 基于Commons Codec的md5算法 */public class Md5CC {    private static final String ENCODING = "UTF-8";        /**     * MD5加密,加密后的结果为二进制字节数组     */    public static byte[] encode(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {        return DigestUtils.md5(data.getBytes(ENCODING));    }        /**     *MD5加密,加密后的结果为二进制字节数组,并且在这里将二进制字节数组转为了32位的16进制     */    public static String encodeMd5Hex(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {        return new String(DigestUtils.md5Hex(data.getBytes(ENCODING)));//这里直接使用new String(encodedByte,"UTF-8")不行    }        /**     * 测试     * @param args     * @throws UnsupportedEncodingException      * @throws NoSuchAlgorithmException      */    public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {                String data = "找一个好姑娘做老婆是我的梦 想!";        /*************测试encode()**************/        System.out.println("原文-->"+data);        byte[] encodedByte = Md5CC.encode(data);        System.out.println("加密后-->"+encodedByte);        byte[] encodedByte2 = Md5CC.encode(data);        System.out.println("加密后-->"+encodedByte2);        for(int i=0;i
"+data); String encodedStr = Md5CC.encodeMd5Hex(data); System.out.println("加密后-->"+encodedStr); String encodedStr2 = Md5CC.encodeMd5Hex(data); System.out.println("加密后-->"+encodedStr2); System.out.println(encodedStr.equals(encodedStr2)); }}

jar包的引入参考第二章的第一个例子进行即可,在测试的过程中,自己去试着看看“同一个消息多次进行MD5加密后结果是不是相同”;

在encode()方法的测试中判断两个byte[]是否相等:按索引依次比较两个字节数组中的元素是否相同即可(如果使用main方法去测的话);如果使用Junit,直接使用assertArrayEquals(array1,array2)即可。

转载地址:http://pxpfm.baihongyu.com/

你可能感兴趣的文章
http://blog.csdn.net/z69183787/article/details/37819831
查看>>
IEEEXtreme Practice Community Xtreme9.0 - Digit Fun!
查看>>
阿里云对象存储OSS————跨域资源共享(CORS)(m3u8 无法加载m3u8:跨域访问被拒绝)...
查看>>
利用Git进行团队协作
查看>>
C++11 并发指南五(std::condition_variable 详解)(转)
查看>>
slf4j 与各个 logging框架的适配器说明
查看>>
postgresql 清空数据表 truncate
查看>>
原来这样就可以开发出一个百万量级的Android相机
查看>>
MySQL执行计划分析
查看>>
素材网
查看>>
在Salesforce中向外公布Service去创建Lead,并且用Asp.Net去调用此Service
查看>>
Mb与MB的区别
查看>>
使用python开发hadoop streaming程序及hadoop python网页抓取例子
查看>>
MySql主主(主从)同步配置详解
查看>>
Mysql 关键字及保留字
查看>>
解析text文本【2】——从数据库读入
查看>>
【配置文件】什么是log4j.properties 怎么配置
查看>>
在linux下使用wc来统计文件行数
查看>>
尚学堂java相关
查看>>
在些时候,放弃治疗或许是最好的选择
查看>>