JAVA摘要算法

article/2025/9/27 17:20:56

  数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。今天,我们就开始java中摘要算法的学习。

 

项目结构如下:

 

SHA算法

  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

一、 HuhxSHA.java

复制代码

package com.huhx.md;import java.security.MessageDigest;import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.junit.Test;/*** wirter: huhx*/
public class HuhxSHA {private static String src = "http://www.cnblogs.com/huhx";// jdk版本的sha算法@Testpublic void jdkSHA1() {try {MessageDigest messageDigest = MessageDigest.getInstance("SHA");messageDigest.update(src.getBytes());byte[] shaBytes = messageDigest.digest();System.out.println("jdk SHA 1: " + Hex.encodeHexString(shaBytes));} catch (Exception e) {e.printStackTrace();}}// commons-codec的sha算法@Testpublic void bcSHA1() {Digest digest = new SHA1Digest();digest.update(src.getBytes(), 0, src.length());byte[] shaBytes = new byte[digest.getDigestSize()];digest.doFinal(shaBytes, 0);System.out.println("bc SHA 1: " + org.bouncycastle.util.encoders.Hex.toHexString(shaBytes));}// bcprov的sha算法@Testpublic void ccSHA1() {System.out.println("cc SHA 1: " + DigestUtils.sha1Hex(src.getBytes()));}
}

复制代码

二、 运行结果如下:

jdk SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f
bc SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f
cc SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f

 

MD算法

MD2
  Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同)。

MD4
  为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。

MD5
  1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

一、 HuhxMD.java

复制代码

package com.huhx.md;import java.security.MessageDigest;
import java.security.Security;import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;public class HuhxMD {private static String src = "http://www.cnblogs.com/huhx";@Testpublic void jdkMD5() {try {MessageDigest messageDigest = MessageDigest.getInstance("MD5");byte[] mdBytes = messageDigest.digest(src.getBytes());System.out.println("md5 decode: " + Hex.toHexString(mdBytes));} catch (Exception e) {e.printStackTrace();}}@Testpublic void jdkMD2() {try {MessageDigest messageDigest = MessageDigest.getInstance("MD2");byte[] mdBytes = messageDigest.digest(src.getBytes());System.out.println("md2 decode: " + Hex.toHexString(mdBytes));} catch (Exception e) {e.printStackTrace();}}@Testpublic void bcmMD4() {// Digest digest = new MD4Digest();// digest.update(src.getBytes(), 0, src.length());// byte[] mdBytes = new byte[digest.getDigestSize()];// digest.doFinal(mdBytes, 0);// System.out.println("md4 decode: " + Hex.toHexString(mdBytes));Security.addProvider(new BouncyCastleProvider());try {MessageDigest messageDigest = MessageDigest.getInstance("MD4");byte[] mdBytes = messageDigest.digest(src.getBytes());System.out.println("md4 decode: " + Hex.toHexString(mdBytes));} catch (Exception e) {e.printStackTrace();}}//@Testpublic void bcmMD5() {Digest digest = new MD5Digest();digest.update(src.getBytes(), 0, src.length());byte[] mdBytes = new byte[digest.getDigestSize()];digest.doFinal(mdBytes, 0);System.out.println("md5 decode: " + Hex.toHexString(mdBytes));}//@Testpublic void ccMD5() {String md5String = DigestUtils.md5Hex(src.getBytes());System.out.println("common md5: " + md5String);}
}

复制代码

二、 运行结果如下:

md4 decode: b402321e9a067da3df0c36c8315f8e38
md5 decode: f121bf5f7491466ae75e056f686c4462
md2 decode: 42b6b066b1273470f9aad644cede7644
md5 decode: f121bf5f7491466ae75e056f686c4462
common md5: f121bf5f7491466ae75e056f686c4462

 由于md5的算法被发现了某些微妙的规律性。所以建议最好使用ShA1的算法。

 

MAC算法

MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制。此时Hash值称作MAC。

MAC算法原理(以直联银联pos和POS中心通讯为例)。

  • 将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MAC ELEMEMENT BLOCK (MAB)。
  •  对MAB,按每8个字节做异或(不管信息中的字符格式),如果最后不满8个字节,则添加“0X00”。

一、 HuhxMAC.java

复制代码

package com.huhx.md;import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;public class HuhxMAC {private static String src = "http://www.cnblogs.com/huhx";private static String decodeKey = "bbbbbbbbbb";@Testpublic void jdkHmacMD5() {try {// 初始化KeyGeneratorKeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");// 产生密钥SecretKey secretKey = keyGenerator.generateKey();// 获得密钥// byte[] keyBytes = secretKey.getEncoded();byte[] keyBytes = org.apache.commons.codec.binary.Hex.decodeHex(decodeKey.toCharArray());// 还原密钥SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacMD5");// 实例化MACMac mac = Mac.getInstance(secretKeySpec.getAlgorithm());// 初始化Macmac.init(secretKeySpec);// 执行摘要byte[] result = mac.doFinal(src.getBytes());System.out.println("jdk mac: " + Hex.toHexString(result));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Testpublic void bcHmacMD5() {HMac hMac = new HMac(new MD5Digest());hMac.init(new KeyParameter(Hex.decode(decodeKey)));hMac.update(src.getBytes(), 0, src.length());byte[] hMacBytes = new byte[hMac.getMacSize()];hMac.doFinal(hMacBytes, 0);System.out.println("bc mac: " + Hex.toHexString(hMacBytes));}
}

复制代码

二、 运行结果如下:

bc mac: 3bf59d550b1e0d6cee15e015870029f9
jdk mac: 3bf59d550b1e0d6cee15e015870029f9

 

友情链接

 

作者: huhx 
出处: www.cnblogs.com/huhx

 


http://chatgpt.dhexx.cn/article/oipHlJCc.shtml

相关文章

摘要算法和加密算法

什么是摘要算法? 摘要算法就是哈希算法,将一条任意长度字符串转为32位的哈希值,是单向的,不能解密。常见的摘要算法有MD5和SHA,本文将用java对MD5算法进行实现。 摘要算法的用途? 1.登录密码的加密&…

三种摘要算法的简单介绍

原文地址: http://blog.csdn.net/u013991521/article/details/48193953 介绍: 消息摘要算法分为三类: MD(Message Digest):消息摘要 SHA(Secure Hash Algorithm):安全散列 MAC(Message Authentication Code)&…

数据分析之运营篇

文章目录 1.指标体系定目标 1.1根据运营的目的,选取不同的指标类型 1.2.北极星指标 1.3 用户留存指标 2.数据分析找问题 2.1.描述分析 2.2多维分析 2.3.相关性分析 2.4.方差分析 2.5 样本检验 2.6 预测分析 3. 3A3R做决策 3.1洞察 3.2获客 3.3.活跃…

京东数据分析工程师(实习生)笔试

忙了一个星期,把最近的笔试面试记录一下。 京东前面单选多选题,后面3道编程题。小题考的很细,各种概率论统计数据库机器学习的知识点,很多都是蒙的,默默的把不会的题记下来,等再学会怎么做了以后发现蒙的都…

Python人力资源员工离职原因数据分析

本项目的数据集来源kaggle竞赛项目:HR-Analytics,自行下载即可! 1.提出问题 公司当中员工们离职的原因是什么? 什么样的员工会离职呢? 2.读取数据,理解数据 导入数据分析工具包,这次我们用seaborn库来优化我们的数据可视化图表! 读取数据 查看数据,head()方法没…

数据分析案例-电影数据分析

目录 电影数据集介绍 加载数据 数据探索和清洗 评分最多的电影 评分最高的电影 评分与年龄的关系 不同年龄段对某部电影的评分 电影数据集介绍 用户信息 #u.user #列名称 user_id,age,gender,occupation,zip_code #数据 1|24|M|technician|85711 2|53|F|other|94043 3…

数据分析岗位招聘分析

项目背景 学习实践数据分析,形成完整报告。分析目标:从行业、城市、学历、经验分析薪资及需求量分布情况 数据获取 集搜客获取拉勾【数据分析】为关键词的职位列表,根据列表职位详情地址爬取职位详情,435条记录,删除重复值后有…

数据分析的工作目标是什么

题图与内容无关,骗点击的。。。 其实这是回答我知识星球一位读者的问题,但恰好也是我现在在做的事情,所以想想,可以写一篇文章分享一下。 数据分析团队的工作方向,按照阶段分为如下目标。 1、提供准确、可靠、及时的基…

数据分析 面经(已拿到offer)

北航计算机专业(计院太卷,现考虑转向信息安全方向)本科二年级,闲来无事找份日常实习试试水 考虑数分岗也是因为楼主目前大二,专业课学习不够深入,开发技术尚不成熟,而sql、excel和数据可视化比…

数据分析笔试经典sql题解

欢迎关注微信公众号:开心数据 前言:sql是数据分析师笔试必考的考点之一,常考的题型有行列转换、联表查询,这些都比较简单,一般考的最难的就是hivesql窗口函数联表查询,普通的聚合函数每组(Group by)只返回…

滴滴出行2020数据分析面试题

目录 数据来源字段释义指标释义其他信息加载包加载数据数据预处理 问题1 订单的应答率、完单率分别是多少?2 呼叫应答时间多长?3 呼叫量最高的是哪一个小时(当地时间)?呼叫量最少的是哪一个小时(当地时间&a…

大数据分析实习生应该如何选择职业方向?

那么,大数据方向实习生到底该做些什么? Excel2013目前可以支持104万行数据,即使是这样也远远算不上大数据。 以下是华院数据整理的2015年大数据相关公司排名 看看你的公司在不在里边? 话说回来,对于一个实习生来说,让你处理Ex…

大数据分析实习生面试题库

大数据分析是一个有吸引力的领域,因为它不仅有利可图,而且您有机会从事有趣的项目,而且您总是在学习新事物。如果您想从头开始,请查看大数据分析实习生面试题库以准备面试要点。 大数据分析是一个有吸引力的领域。这是有利可图的&…

数据分析师实习岗笔试题(part1)

笔试后记,仅供参考 因为公司说不能泄露笔试题,所以我就加了点润色,但是不影响内容 限时免费:3小时 前言 笔试时间:2020年6月 笔试方式:在线笔试 笔试内容:sql语言、R语言/python、统计学相关知识 笔试时间:2小时之内 来几个励志的名人名言吧 要随时牢记在心中:决心…

【数据分析】滴滴数据分析岗实习经验

转载自:数据管道 原作者介绍:双非院校刚毕业的统计硕士,目前在滴滴工作,有8个月的数据分析实习经历,面试过10位以上数据分析实习生,最终成为了产品经理。 在原文的基础上有过删减。 两个主题 本文的主要目…

数据分析真题日刷 | 网易2018实习生招聘笔试题-数据分析实习生

上周开始实习,博客更新就缓下来了。这是十天前做的套题了,现在拾起来把它再整理整理。 网易数据分析实习生的笔试题,和校招的题目还是有部分重复的,不过难度也不小。 今日真题 网易2018实习生招聘笔试题-数据分析实习生 &#x…

数据分析——实习僧数据分析岗招聘信息分析

随着互联网技术不断完善,市场竞争日益激烈,粗放经营的企业将很难实现可持续发展。为改变这一现状,越来越多的企业开始对自身数据进行深度分析和挖掘,并以此辅助决策人员进行精细化决策管理。由此,越来越多的数据分析师应运而生。 本人初步踏入这一领域,希望对数据分析实…

分析数据分析实习岗位信息(1、数据获取)

目录 1.1 网页分析1.2 字体反扒机制1.3 构造字典1.4 创建表1.5 根据自己的需要进行修改 又到了一年一度的秋招了,由于受疫情的影响,部分公司减少了数据分析相关岗位的实习名额,为了更了解秋招的相关岗位信息,这里针对实习僧 网站…

我在滴滴数据分析岗实习了8个月

作者介绍:双非院校刚毕业的统计硕士,目前在滴滴工作,有8个月的数据分析实习经历,面试过10位以上数据分析实习生,最终成为了产品经理。 两个主题 本文的主要目标是帮助一些刚入门的同学了解互联网公司中“数据分析”岗位…

LOUVAIN——社交网络挖掘之大规模网络的社区发现算法

LOUVAIN——社交网络挖掘之大规模网络的社区发现算法 算法来源 该算法来源于文章Fast unfolding of communities in large networks,简称为Louvian。 算法原理 Louvain算法是基于模块度(Modularity)的社区发现算法,该算法在效率…