文章目录

  • 前言
  • 一、什么是消息摘要算法
  • 二、消息摘要算法家谱
    • 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. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
  2. 修改串口设备名ttymxc1_Modbus通讯之串口联网设备
  3. 俞敏洪在北大2008年开学典礼上的演讲
  4. handlerinterceptoradapter 获取请求参数_SSM框架防止重复请求
  5. 微软面试题及答案 (很需要开放性思维啊)
  6. Hi Table定义未来电视!祝贺海信发布S7社交电视! ​
  7. php下载 微信头像图片_php 下载微信头像
  8. [总结] 本人代表性博客总结
  9. 设计模式-工厂模式-3种-以手机制造工厂为例
  10. uniapp 使用uView UI教程
  11. Dynamics 365Online Server-Side OAuth身份认证二(S2S)
  12. 第十二课,assimp模型加载(数据加载篇)
  13. NVMe Driver 需要装吗_厨房里的油烟很少,需要装油烟净化器吗?装哪种的比较好?...
  14. PHP 微信支付 企业支付个人 企业转账个人 企业转零钱
  15. android 蓝牙ble调试助手,Android蓝牙调试助手源码分享
  16. android自定义抽奖,Android简单实现圆盘抽奖界面
  17. 手机199开头的号码的正则验证
  18. jqurey常用知识点 (非常重要!)
  19. serviceaccounts is forbidden: User “system:serviceaccount:kubernetes-dashboard:kubernetes-dashboard“
  20. 高级IDE工具:Elipse的使用

热门文章

  1. debian 的小软件。
  2. 互联网直播平台Storm金融项目-杨帅-专题视频课程
  3. 大数据时代 你的生活被“格式化”了没
  4. AI笔记整理篇 -程序员35岁中年危机是真的吗?
  5. 使用IDEA连接阿里云Redis
  6. 记一次诡异的 ssh 互信免密码登录失败
  7. 深度学习实验基础02:实验室服务器使用
  8. 爬虫入门实践之多线程爬虫
  9. android camera surface不显示图像问题
  10. 分享当下人生——一个高中毕业生在中央电视台的六星期实习经历