当前位置: 首页 > news >正文

数字安全二之密钥结合消息摘要

HMACSHA256的定义

HMACSHA256是一种使用 SHA-256 哈希算法的 HMAC(基于哈希的消息认证码,Hash-based Message Authentication Code) 机制。它结合了【散列函数】 和 【密钥】,用于确保消息的完整性和真实性


HMAC 与 SHA-256 的作用:

HMAC: HMAC 是一种消息认证码,用来验证消息的完整性和身份的真实性。它通过一个 密钥 和一个 散列函数(比如 SHA-256)对消息进行处理。相比单纯的哈希函数,HMAC 具有更高的安全性,因为它依赖于一个密钥,而不仅仅是消息内容。
SHA-256: SHA-256 是一种广泛使用的加密安全散列算法(属于 SHA-2 家族),它将任意长度的输入转换为一个长度为 256 位(32 字节)的固定长度输出。它被认为是相对安全的哈希算法。


HMAC-SHA256 的工作原理:

HMAC 结合了一个【秘密密钥】和【输入消息】,通过以下步骤生成消息认证码:
1.密钥处理:密钥如果长度不足会进行填充,过长则会进行哈希压缩。
2.内部哈希:将密钥与消息进行拼接并进行哈希计算。
3.外部哈希:对内部哈希结果进行进一步处理,再次通过哈希函数生成最终的认证码。
这个过程确保了即使消息的内容被篡改,没有正确的密钥,也无法生成相同的 HMAC 值,从而确保了数据的完整性和真实性。


HMACSHA256 的作用:

数据完整性:保证消息在传输过程中未被篡改。如果消息在传输中被更改,接收方计算的 HMAC 值将与发送方的不同。
身份验证:由于 HMAC 需要密钥,接收方可以通过验证 HMAC 值来确认消息是否来自合法发送方。


Java 实现 HMAC-SHA256

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class HMACSHA256Example {

    public static void main(String[] args) {
        String secretKey = "your-secret-key";
        String message = "Hello, World!";

        try {
            // 创建一个HMAC-SHA256的Mac实例
            Mac mac = Mac.getInstance("HmacSHA256");
            
            // 初始化密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
            mac.init(secretKeySpec);
            
            // 计算HMAC哈希值
            byte[] hmacSha256Bytes = mac.doFinal(message.getBytes());
            
            // 将结果转换为Base64或十六进制输出(这里使用Base64编码)
            String hmacSha256Base64 = Base64.getEncoder().encodeToString(hmacSha256Bytes);
            
            // 输出HMAC-SHA256结果
            System.out.println("HMAC-SHA256: " + hmacSha256Base64);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


类似的常见算法:

HmacSHA256: 使用 SHA-256 的 HMAC 算法。
HmacSHA1: 使用 SHA-1 的 HMAC 算法。
HmacMD5: 使用 MD5 的 HMAC 算法。


HMAC-SHA256 和 SHA-256 的区别
特性SHA-256HMAC-SHA256
全称安全哈希算法 256 位 (Secure Hash Algorithm 256-bit)基于密钥的消息认证码 (Hash-based Message Authentication Code using SHA-256)
用途生成数据的哈希摘要,用于验证数据的完整性生成基于密钥的哈希值,用于验证消息的完整性和真实性
是否使用密钥
安全性提供数据完整性验证,但不能验证数据来源提供数据完整性和数据来源的验证
抗篡改能力数据可能被篡改,但无法发现结合密钥后,可以检测数据是否被篡改
应用场景文件校验、数字签名、加密货币、密码哈希API 请求签名、消息认证、网络协议安全
输出长度256 位(32 字节)256 位(32 字节)
长度扩展攻击可能受到长度扩展攻击抗长度扩展攻击
算法复杂度较低,只需单次哈希计算较高,需要两次哈希计算(内、外层)
速度更快略慢,因为要进行两次哈希运算
依赖的安全因素SHA-256 算法的抗碰撞性和抗篡改性SHA-256 算法和密钥的安全性
是否提供身份验证

相关文章:

  • 利用Java easyExcel库实现高效Excel数据处理
  • 基于RealSense D435相机实现手部姿态重定向
  • 水仙花数求解-C语言
  • 另外知识与网络总结
  • 5V继电器模块详解(STM32)
  • 多IP站群服务器对SEO优化的几大好处
  • 算法打卡:第十一章 图论part08
  • 在C#中使用JSON
  • 【test】google cloud
  • Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据
  • 微服务--初识MQ
  • 车辆重识别(去噪扩散概率模型)论文阅读2024/9/27
  • centos7 yum 更新 nginx 到最新版本 1.26
  • 酒水速送小程序开发制作方案
  • 传奇架设教程:传奇登录器公告窗口如何设置?link.htm网页文件制作教程
  • 收藏网友的 源程序下载网
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • codis proxy处理流程
  • Github访问慢解决办法
  • HashMap剖析之内部结构
  • HTTP中的ETag在移动客户端的应用
  • JavaScript学习总结——原型
  • Less 日常用法
  • MaxCompute访问TableStore(OTS) 数据
  • mongodb--安装和初步使用教程
  • mysql常用命令汇总
  • php面试题 汇集2
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • rc-form之最单纯情况
  • Webpack 4 学习01(基础配置)
  • 翻译--Thinking in React
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 模型微调
  • 设计模式 开闭原则
  • 听说你叫Java(二)–Servlet请求
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 怎么把视频里的音乐提取出来
  • 正则学习笔记
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • "无招胜有招"nbsp;史上最全的互…
  • ###C语言程序设计-----C语言学习(3)#
  • #php的pecl工具#
  • #预处理和函数的对比以及条件编译
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)Hilt的基本概念和使用
  • (175)FPGA门控时钟技术
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (笔试题)合法字符串
  • (二十四)Flask之flask-session组件
  • (翻译)terry crowley: 写给程序员
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (六)Flink 窗口计算
  • (南京观海微电子)——I3C协议介绍
  • (十五)、把自己的镜像推送到 DockerHub
  • (四)软件性能测试