java实现消息摘要算法
文章目录
- 前言
- 一、什么是消息摘要算法
- 二、消息摘要算法家谱
- 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 |
分为两步
- 构建密钥
- 执行消息摘要
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实现消息摘要算法相关推荐
- Java常用消息摘要算法-MD5
本工具类可实现对字符串或者文件提取MD5值(MD5加密) import java.io.File; import java.io.FileInputStream; import java.io.Inp ...
- 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 ...
- Java之消息摘要之commons codec
文章目录 前言 commons codec的导入 字符串的消息摘要 文件的消息摘要 前言 本篇关于Hash.摘要算法的前备理论参考 消息摘要(Message Digest)及其算法. JDK自带jav ...
- html数据摘要算法,Hash函数和消息摘要算法(示例代码)
一.Hash函数 哈希函数就是能将任意长度的数据映射为固定长度的数据的函数.哈希函数返回的值被叫做哈希值.哈希码.散列,或者直接叫做哈希. 二.消息摘要 将长度不固定的消息(message)作为输入参 ...
- 常用的消息摘要算法小总结
今天偶然的学习了一下几种关于消息摘要算法的知识.个人觉得很好.应着老话"好记性不如烂笔头",我就码了几行代码咯. 算法嘛,没什么好说的了.毕竟是设计者智慧与汗水的结晶,也是时代进步 ...
- 消息摘要算法-SHA算法实现
简述 SHA算法分为一代和二代,这个是美国安全局发布的一系列的密码散列算法. 基于如下两点安全理由: 1.从消息摘要反推输入信息,从计算理论上来说很困难 2.想找到两组不同的消息对应到相应的消息摘要, ...
- 快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底
面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密和非对称加密.其中,对称加密算法在加密和解密时使用的密钥相同:非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥.此外, ...
- 消息摘要算法与密码加密
在Spring Boot项目中,提供了DigestUtils工具类,此工具类的方法可以轻松实现"使用MD5算法"进行运算,从而,可以实现将原始密码进行加密,得到一个加密后的结果. ...
- 消息摘要算法---加密学习笔记(二)
介绍: 消息摘要算法分为三类: MD(Message Digest):消息摘要 SHA(Secure Hash Algorithm):安全散列 MAC(Message Authentication C ...
最新文章
- python 输出大文本文件
- 利用计算机技术教学图片,教育教学论文 科学学科如何利用计算机技术提高教学效率.doc...
- 如何找出数组中第二大的数
- 【敏捷测试】一个测试人员在参与敏捷测试的经验分享(3)
- sql2005 性能调校 观察各种资源的使用情况
- hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些
- 什么是微服务_漫画:到底什么是微服务?
- Shell自动备份部署新项目
- 丰田凯美瑞android系统,丰田第八代凯美瑞装了它,让中控“大脑”更智能!
- 手把手教你十分钟学会使用小程序云存储
- 串口 单片机 文件_DIY迷你单片机学习板
- mysqlReport 详细解析
- 粉丝不足5万的公众号,怎么在60秒内变现?
- mysql 1677错误_[转载]MySQL 5.5.12 row格式复制下从库结构变更引发1677错误一则
- [转]结合php5与zend_search_lucene来创建一个全文搜索引擎
- 使用Saiku+Kylin构建多维分析OLAP平台
- 文本匹配(语义相似度/行为相关性)技术综述
- 为什么路由器恢复出厂设置后网络不可用?家里网断了怎么办?如何配置新买的路由器?
- 【JavaScript】JavaScript基础篇
- 2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细)