常用几种消息摘要算法

article/2025/9/27 17:12:36

文章目录

      • 1、`MD5 (Message Digest algorithm 5 消息摘要算法版本5)`
      • 2、`SHA (Secure Hash Algorithm 安全散列算法)`
      • 3、`MAC (Hash Message Authentication Code 散列消息鉴别码)`

消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。

消息摘要采用单向Hash函数将需加密的明文"摘要"成一串固定位数(如128bit)的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是“真身”的“指纹”了。

消息摘要具有不可逆性,在消息摘要生成过程中,会丢失很多原文的信息,而且无法找回。一个好的摘要算法,是极难产生Hash碰撞的,也就是找到另一段明文经计算后产生相同的摘要。

相关文章:

  • https://www.cnblogs.com/yueshutong/p/11275420.html
  • https://www.iteye.com/blog/snowolf-379860

有以下几种:

1、MD5 (Message Digest algorithm 5 消息摘要算法版本5)

MD是应用非常广泛的一个算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4发展而来,由Ron Rivest(RSA公司)在1992年提出,目前被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD2、MD4、MD5 都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。

目前在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV 类似的方法来检查文件完整性,目前绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最常用算法。与MD5 相关的工具有很多,如 WinMD5等。

案例实现:

/*** MD5 测试* <br/>* 参考:https://www.jianshu.com/p/be000cf837b2*/
class Md5Test {public static void main(String[] args) throws NoSuchAlgorithmException {/* 得注意加密后字符串的大小写 */// 待加密字符String originalStr = "111111";System.out.println(String.format("待加密字符: %s", originalStr));// 已加密字符String alreadyDigestStr = "96E79218965EB72C92A549DD5A330112";System.out.println(String.format("已加密字符: %s", alreadyDigestStr));/* jdk 实现 */System.out.println("--------------jdk 实现-----------------");// 获取信息摘要对象MessageDigest md5 = MessageDigest.getInstance("MD5");// 完成摘要byte[] digest = md5.digest(originalStr.getBytes());// 将摘要转换成 16 进制字符 (大写)String javaMd5Str = DatatypeConverter.printHexBinary(digest);System.out.println(String.format("%s 加密结果:%s", originalStr, javaMd5Str));// 匹配验证System.out.println(String.format("验证结果:%b", Objects.equals(javaMd5Str, alreadyDigestStr)));/* Apache commons-codec 实现 */System.out.println("---------------Apache commons-codec 实现------------");// 小写String apacheMd5Str = DigestUtils.md5Hex(originalStr.getBytes()).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, apacheMd5Str));System.out.println(String.format("验证结果:%b", Objects.equals(apacheMd5Str, alreadyDigestStr)));/* spring提供 */System.out.println("-----------spring提供-----------");// 小写String springMd5Str = org.springframework.util.DigestUtils.md5DigestAsHex(originalStr.getBytes()).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, springMd5Str));System.out.println(String.format("验证结果:%b", Objects.equals(springMd5Str, alreadyDigestStr)));}}

运行效果如下:

20191023215219.png

MD算法可用于密码保护。在用户注册时,利用MD算法取密码的摘要值,存入数据库。在用户登录时,将用户密码再次消息摘要后,与数据库密码进行比较即可得出用户登录结果。流程图如下:

20191023173151.png

MD5加密,是属于不可逆的。我们知道正常使用MD5加密技术,同一字符,加密后的16进制数是不变的,自从出现彩虹表,对于公司内部员工来说,可以反查数据,获取不可能的权限,所以出现了salt算法。

md5加盐算法,代码如下:

package com.blog.www.util.coder;import org.apache.commons.codec.digest.DigestUtils;import java.util.Objects;
import java.util.Random;/*** MD5 加随机盐加密* <br/>* 参考: <a href='https://www.cnblogs.com/peaceliu/p/7825706.html'>MD5加密+加盐</a>* <br/>* 基于:{@link DigestUtils}* <p>* 创建人:leigq <br>* 创建时间:2018-12-04 15:42 <br>* <p>* 修改人: <br>* 修改时间: <br>* 修改备注: <br>* </p>*/
public class MD5WithSalt {/*** 生成含有随机盐的加密字符串* <br>创建人: leigq* <br>创建时间: 2018-12-04 15:35* <br>** @param data 待加密的字符* @return 加密后的字符(含 16 位随机盐),大写*/public static String encrypt(String data) {Random r = new Random();StringBuilder sb = new StringBuilder(16);sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));int len = sb.length();if (len < 16) {for (int i = 0; i < 16 - len; i++) {sb.append("0");}}String salt = sb.toString();String md5WithSaltStr = DigestUtils.md5Hex(data + salt);char[] cs = new char[48];for (int i = 0; i < 48; i += 3) {cs[i] = md5WithSaltStr.charAt(i / 3 * 2);char c = salt.charAt(i / 3);cs[i + 1] = c;cs[i + 2] = md5WithSaltStr.charAt(i / 3 * 2 + 1);}return new String(cs).toUpperCase();}/*** 校验密码是否正确* <br>创建人: leigq* <br>创建时间: 2018-12-04 15:38* <br>** @param data                    待验证的字符(明文)* @param md5StrContainRandomSalt 加密后的字符(含 16 位随机盐)* @return 验证结果*/public static boolean verify(String data, String md5StrContainRandomSalt) {// 32 位加密字符(不含盐)char[] cs1 = new char[32];// 16 位的随机盐char[] cs2 = new char[16];for (int i = 0; i < 48; i += 3) {cs1[i / 3 * 2] = md5StrContainRandomSalt.charAt(i);cs1[i / 3 * 2 + 1] = md5StrContainRandomSalt.charAt(i + 2);cs2[i / 3] = md5StrContainRandomSalt.charAt(i + 1);}String salt = new String(cs2);return Objects.equals(DigestUtils.md5Hex(data + salt).toUpperCase(), new String(cs1));}
}

测试:

/*** md5 加随机盐测试*/
class MD5WithSaltTest {public static void main(String[] args) {// 待加密字符String originalStr = "111111";// 已加盐加密字符String md5WithSaltStr = MD5WithSalt.encrypt(originalStr);System.out.println(String.format("%s 加密结果:%s", originalStr, md5WithSaltStr));// 不能直接再次加密验证,因为使用了随机盐,每次加密出来的字符串都不同boolean verifyResult = MD5WithSalt.verify(originalStr, md5WithSaltStr);System.out.println(String.format("验证结果:%b", verifyResult));}
}

测试结果如下:

20191023215349.png


2、SHA (Secure Hash Algorithm 安全散列算法)

SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构——美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA-1为20字节(160位)、SHA-224为32字节(224位)、SHA-256为32字节(256位)、SHA-384为48字节(384位)、SHA-512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此较之MD5更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。

目前SHA1的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。

代码实现:

/*** SHA 加密算法测试*/
class SHATest {public static void main(String[] args) throws NoSuchAlgorithmException {// 待加密字符String originalStr = "111111";System.out.println(String.format("待加密字符: %s", originalStr));// 已加密字符String alreadyDigestStr = "3D4F2BF07DC1BE38B20CD6E46949A1071F9D0E3D";System.out.println(String.format("已加密字符: %s", alreadyDigestStr));/* jdk 实现 */// 获取信息摘要对象 (SHA1),另外还有 SHA-224、SHA-256、SHA-384、SHA-512MessageDigest md5 = MessageDigest.getInstance("SHA");// 完成摘要byte[] digest = md5.digest(originalStr.getBytes());// 将摘要转换成 16 进制字符 (大写)String javaShaStr = DatatypeConverter.printHexBinary(digest);System.out.println(String.format("%s 加密结果:%s", originalStr, javaShaStr));// 匹配验证System.out.println(String.format("验证结果:%b", Objects.equals(javaShaStr, alreadyDigestStr)));/* Apache commons-codec 实现 */String apacheShaStr = DigestUtils.sha1Hex(originalStr.getBytes()).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, apacheShaStr));System.out.println(String.format("验证结果:%b", Objects.equals(apacheShaStr, alreadyDigestStr)));/* SHA256 */System.out.println(DigestUtils.sha256Hex(originalStr.getBytes()));/* SHA384 */System.out.println(DigestUtils.sha384Hex(originalStr.getBytes()));/* SHA512 */System.out.println(DigestUtils.sha512Hex(originalStr.getBytes()));}
}

运行结果如下:

20191024102910.png

消息鉴别:

20191024102954.png


3、MAC (Hash Message Authentication Code 散列消息鉴别码)

MAC算法 (Message Authentication Codes消息认证码算法) 含有密钥的散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。消息的散列值由只有通信双方知道的密钥来控制。此时Hash值称作MAC。

经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同。例如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。

流程分析:

甲乙双方进行数据交换可以采取如下流程:

1.甲方向乙方公布摘要算法(就是指定要使用的摘要算法名)

2.甲乙双方按照约定构造密钥,双方拥有相同的密钥(一般是一方构造密钥后通知另外一方,此过程不需要通过程序实现,就是双方约定个字符串,但是这个字符串可不是随便设定的,也是通过相关算法获取的)

3.甲方使用密钥对消息做摘要处理,然后将消息和生成的摘要消息一同发送给乙方

4.乙方收到消息后,使用甲方已经公布的摘要算法+约定好的密钥 对收到的消息进行摘要处理。然后比对自己的摘要消息和甲方发过来的摘要消息。甄别消息是否是甲方发送过来的。

代码实现:

/*** MAC 算法测试*/
class MacTest {public static void main(String[] args) throws NoSuchAlgorithmException, DecoderException, InvalidKeyException {// 待加密字符String originalStr = "111111";System.out.println(String.format("待加密字符: %s", originalStr));// 已加密字符String alreadyDigestStr = "74B31DBA9E16CCF752B294A18271BC6A";System.out.println(String.format("已加密字符: %s", alreadyDigestStr));/* jdk 实现 */// 初始化 KeyGenerator, jdk 提供 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和 HmacSHA512 四种算法
//		KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");// 产生密钥
//		SecretKey secretKey = keyGenerator.generateKey();// 默认密钥// byte[] defaultKey = secretKey.getEncoded();// 自定义密钥byte[] myKey = Hex.decodeHex(new char[]{'a','a','a','a','a','a','a','a','a','a'});// 还原密钥SecretKey restoreSecretKey = new SecretKeySpec(myKey, "HmacMD5");// 实例化 MACMac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());// 初始化 MACmac.init(restoreSecretKey);//执行摘要byte[] hmacMD5Bytes = mac.doFinal(originalStr.getBytes());String encodeHexString = Hex.encodeHexString(hmacMD5Bytes).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, encodeHexString));System.out.println(String.format("验证结果:%b", Objects.equals(encodeHexString, alreadyDigestStr)));/* apache 实现 */// HmacMD5HmacUtils hmacMd5 = new HmacUtils(HmacAlgorithms.HMAC_MD5, myKey);String apacheHmacMd5 = hmacMd5.hmacHex(originalStr.getBytes()).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, apacheHmacMd5));System.out.println(String.format("验证结果:%b", Objects.equals(apacheHmacMd5, alreadyDigestStr)));// HmacSHA1HmacUtils hmacSha1 = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, KeyGenerator.getInstance(HmacAlgorithms.HMAC_SHA_1.getName()).generateKey().getEncoded());String apacheHmacHex1 = hmacSha1.hmacHex(originalStr.getBytes()).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, apacheHmacHex1));// HmacSHA256HmacUtils hmacSha256 = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, KeyGenerator.getInstance(HmacAlgorithms.HMAC_SHA_256.getName()).generateKey().getEncoded());String apacheHmacSha256 = hmacSha256.hmacHex(originalStr.getBytes()).toUpperCase();System.out.println(String.format("%s 加密结果:%s", originalStr, apacheHmacSha256));// HmacSHA384 , 类似上面// HmacSHA512, 类似上面}
}

运行结果:

20191024114046.png

上面这几种摘要算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。


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

相关文章

摘要算法与加密(以MD5算法为例)

【README】 部分内容总结自&#xff1a; 摘要与加密的区别&#xff08;以MD5算法为例&#xff09; - 掘金https://juejin.cn/post/6844903561478799368 【1】摘要算法与加密区别 【1.1】摘要算法&#xff08;不可逆&#xff09; 1&#xff09;摘要算法&#xff1a; 说白了…

报文摘要算法

1 报文摘要算法 报文摘要算法是一种将任意长度报文转换成固定长度的报文摘要算法。它具有以下六个特点&#xff1a;能够作用于任意长度的报文&#xff1b;产生有限位数的标识信息&#xff1b;易于实现&#xff1b;具有单向性&#xff1b;具有抗碰撞性&#xff1b;具有高灵敏性…

摘要算法

摘要算法是一种能产生特殊输出格式的算法&#xff0c;这种算法的特点是&#xff1a;无论用户输入多少长度的原始数据&#xff0c;经过计算后输出的密文都是固定长度的&#xff0c;这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取&#xff0c;这种提取就是摘要&a…

JAVA摘要算法

数据摘要算法是密码学算法中非常重要的一个分支&#xff0c;它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能&#xff0c;由于其不可逆性&#xff0c;有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希&#xff08;Hash&#xff09;算法、散列算法。…

摘要算法和加密算法

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

三种摘要算法的简单介绍

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

数据分析之运营篇

文章目录 1.指标体系定目标 1.1根据运营的目的&#xff0c;选取不同的指标类型 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.活跃…

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

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

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…

数据分析岗位招聘分析

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

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

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

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

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

数据分析笔试经典sql题解

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

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

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

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

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

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

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

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

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

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

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

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

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