文章目录

  • 前言
  • 一、什么是消息摘要算法
  • 二、消息摘要算法家谱
    • 1.MD算法
    • 2.SHA算法
    • 3.MAC算法
  • 三、代码实现
    • 1.引入jar包
    • 2.MD5算法
    • 3.SHA256算法
    • 3.HmacSHA256算法
  • 总结

前言

散列函数,也称作哈希函数、消息摘要函数。经常用到的MD5就属于这个范畴。本篇介绍什么是消息摘要、作用及几种实现方式


一、什么是消息摘要算法

消息摘要函数的主要作用不是完成数据的加密与解密工作的,它是用来验证数据完整性的重要技术。通过摘要函数,可以为数据创建“数字指纹”(散列值)。其认证流程图如下

特点:

  • 单向性,运算过程不可逆
  • 任意两个不同消息的散列值一定不同
  • 散列值不同,则原始消息一定不同
    各大软件厂商提供软件下载的时候会附带上数字指纹,如mysql

    为了方便人们识别和阅读,数字指纹常以十六进制字符的串的形式出现

二、消息摘要算法家谱

1.MD算法

MD5算法是典型的消息摘要算法,它由MD4、MD3、MD2算法改进而来。无论是哪种MD算法,它们都需要获得一个随机长度的信息并产生一个128位的二进制信息摘要,转换成16进制就是32位的字符串。我们见到的大部分MD5算法的数字指纹都是32位十六进制的字符串。
随着计算机发展水平的提高,MD5算法已不再适合安全要求较高的场合

2.SHA算法

SHA算法基于MD4算法基础之上,其与MD算法不同之处在于摘要长度,SHA算法的摘要长度更长,安全性更高
发展历史:

  • SHA-0算法,1983年第一个版本,因降低密码安全性撤回
  • SHA-1算法,1995年发布,通常我们也把SHA-1算法简称为SHA算法。其在安全协定中使用广泛。包括TLS/SSL,SSH等。SHA-0和SHA-1算法可对最大长度为264的字节信息做摘要处理,得到160位的摘要信息,40为16进制的字符串
  • SHA-2算法,是SHA-224,SHA-256,SHA-384,SHA-512四种算法的总称。

3.MAC算法

MAC算法结合了MD5和SHA算法的优势,并加入了密钥的支持,是一种更为安全的消息摘要算法。我们也通常把MAC算法称为HMAC算法(keyed-Hash Message Authentication Code)

经MAC算法得到的摘要值长度与参与实现的算法摘要值长度相同。如,HmacSHA1得到的摘要长度就是160位二进制,换算成十六进制编码就是40位。

三、代码实现

1.引入jar包

这里引入辅助jar包

<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version>
</dependency>

2.MD5算法

实现细节

算法 摘要长度 备注
MD2 128 jdk实现
MD5 128 jdk实现
MD4 128 Bouncy Castle实现

代码

public class MDUtil {public static void main(String[] args) {md5("helloWorld");}public static void md5(String src) {String md5Hex = DigestUtils.md5Hex(src.getBytes(StandardCharsets.UTF_8));System.out.println(md5Hex);}
}

3.SHA256算法

实现细节

算法 摘要长度 备注
SHA-1 160 jdk实现
SHA-256 256 jdk实现
SHA-384 384 jdk实现
SHA-512 512 jdk实现
SHA-224 224 Bouncy Castle

代码

public class SHAUtil {public static void main(String[] args) {sha256("helloWorld");}private static void sha1(String src) {byte[] results = DigestUtils.sha1(src);System.out.println(Hex.encodeHexString(results));}private static void sha256(String src) {byte[] results = DigestUtils.sha256(src);System.out.println(Hex.encodeHexString(results));}
}

3.HmacSHA256算法

实现细节

算法 摘要长度 备注
HmacMD5 128 jdk实现
HmacSHA1 160
HmacSHA256 256
HmacSHA384 384
HmacSHA512 512
HmacMD2 128 Bouncy Castle实现
HmacMD4 128
HmacSHA224 224

分为两步

  1. 构建密钥
  2. 执行消息摘要
public class HmacUtil {public static void main(String[] args) throws Exception {byte[] result = hmacSHA256(initHmacSHA256Key(), "helloWorld");System.out.println(Hex.toHexString(result));}/*** 初始化密钥** @return 密钥* @throws NoSuchAlgorithmException NoSuchAlgorithmException*/public static byte[] initHmacSHA256Key() throws NoSuchAlgorithmException {KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");SecretKey secretKey = keyGenerator.generateKey();return secretKey.getEncoded();}public static byte[] hmacSHA256(byte[] key, String valueToDigest) throws Exception {// 还原密钥SecretKeySpec sk = new SecretKeySpec(key, "HmacSHA256");Mac mac = Mac.getInstance(sk.getAlgorithm());mac.init(sk);return mac.doFinal(valueToDigest.getBytes(StandardCharsets.UTF_8));}public static byte[] initHmacMD5Key() throws NoSuchAlgorithmException {KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");SecretKey secretKey = keyGenerator.generateKey();return secretKey.getEncoded();}private static byte[] hmacMd5(byte[] key, String valueToDigest) throws NoSuchAlgorithmException, InvalidKeyException {// 还原密钥SecretKeySpec sk = new SecretKeySpec(key, "HmacMD5");Mac mac = Mac.getInstance(sk.getAlgorithm());mac.init(sk);return mac.doFinal(valueToDigest.getBytes(StandardCharsets.UTF_8));}}

总结

消息摘要算法其主要作用是认证消息的完整性。MD5是较为常用的消息摘要算法,不过其已不安全,在安全要求较高的场景不再使用,如网络传输敏感数据。笔者在项目中用的最多的是带有密钥的HmacSHA256算法。

java实现消息摘要算法相关推荐

  1. Java常用消息摘要算法-MD5

    本工具类可实现对字符串或者文件提取MD5值(MD5加密) import java.io.File; import java.io.FileInputStream; import java.io.Inp ...

  2. JAVA加密解密→术语、密码分类、OSI与TCP/IP安全体系、Base64、消息摘要算法MD/SHA/MAC、对称加密算法DES/AES/PBE、非对称加密算法DH/RSA/EIGamaI

    术语 密码分类 OSI与TCP/IP安全体系 JAVA安全 Base64算法 消息摘要算法MD 消息摘要算法MD图解 消息摘要算法SHA 消息摘要算法SHA图解 消息摘要算法MAC 消息摘要算法MAC ...

  3. Java之消息摘要之commons codec

    文章目录 前言 commons codec的导入 字符串的消息摘要 文件的消息摘要 前言 本篇关于Hash.摘要算法的前备理论参考 消息摘要(Message Digest)及其算法. JDK自带jav ...

  4. html数据摘要算法,Hash函数和消息摘要算法(示例代码)

    一.Hash函数 哈希函数就是能将任意长度的数据映射为固定长度的数据的函数.哈希函数返回的值被叫做哈希值.哈希码.散列,或者直接叫做哈希. 二.消息摘要 将长度不固定的消息(message)作为输入参 ...

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

    今天偶然的学习了一下几种关于消息摘要算法的知识.个人觉得很好.应着老话"好记性不如烂笔头",我就码了几行代码咯. 算法嘛,没什么好说的了.毕竟是设计者智慧与汗水的结晶,也是时代进步 ...

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

    简述 SHA算法分为一代和二代,这个是美国安全局发布的一系列的密码散列算法. 基于如下两点安全理由: 1.从消息摘要反推输入信息,从计算理论上来说很困难 2.想找到两组不同的消息对应到相应的消息摘要, ...

  7. 快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密和非对称加密.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥.此外, ...

  8. 消息摘要算法与密码加密

    在Spring Boot项目中,提供了DigestUtils工具类,此工具类的方法可以轻松实现"使用MD5算法"进行运算,从而,可以实现将原始密码进行加密,得到一个加密后的结果. ...

  9. 消息摘要算法---加密学习笔记(二)

    介绍: 消息摘要算法分为三类: MD(Message Digest):消息摘要 SHA(Secure Hash Algorithm):安全散列 MAC(Message Authentication C ...

最新文章

  1. python 输出大文本文件
  2. 利用计算机技术教学图片,教育教学论文 科学学科如何利用计算机技术提高教学效率.doc...
  3. 如何找出数组中第二大的数
  4. 【敏捷测试】一个测试人员在参与敏捷测试的经验分享(3)
  5. sql2005 性能调校 观察各种资源的使用情况
  6. hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些
  7. 什么是微服务_漫画:到底什么是微服务?
  8. Shell自动备份部署新项目
  9. 丰田凯美瑞android系统,丰田第八代凯美瑞装了它,让中控“大脑”更智能!
  10. 手把手教你十分钟学会使用小程序云存储
  11. 串口 单片机 文件_DIY迷你单片机学习板
  12. mysqlReport 详细解析
  13. 粉丝不足5万的公众号,怎么在60秒内变现?
  14. mysql 1677错误_[转载]MySQL 5.5.12 row格式复制下从库结构变更引发1677错误一则
  15. [转]结合php5与zend_search_lucene来创建一个全文搜索引擎
  16. 使用Saiku+Kylin构建多维分析OLAP平台
  17. 文本匹配(语义相似度/行为相关性)技术综述
  18. 为什么路由器恢复出厂设置后网络不可用?家里网断了怎么办?如何配置新买的路由器?
  19. 【JavaScript】JavaScript基础篇
  20. 2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细)

热门文章

  1. android 气球提示控件,控件Balloons(气球状提示)设计原则
  2. ​UPS快递如何计算国际包裹的重量和体积
  3. 一维,多维背包问题(体积,重量)
  4. 劳保鞋厂家带你深入了解防静电安全鞋——百华劳保
  5. Pygame Surface创建图像
  6. RGB-D图像(深度图像)的Surface编码
  7. Linux FTP服务器搭建(Docker)
  8. 微信新功能内测曝光,再次向支付宝发起挑战
  9. 人体骨骼关键点检测综述(1)
  10. 洋桃技术支持0005:洋桃1号开发板上电不运行如何解决?