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