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

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 算法和密钥的安全性
是否提供身份验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据新视界 --大数据大厂之HBase 在大数据存储中的应用与表结构设计

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

如何进行Ubuntu磁盘空间深度清理?

近期使用AutoDL算力云,发现系统盘只有30G,数据盘只有50G,跑一个稍微大一点的模型,马上空间就拉爆了,现在做一个磁盘深度清理操作,看看效果。 清理前磁盘占用如下: 在 Ubuntu 系统中进行磁盘深度…

如何选择适合的编程工具提高工作效率

---  随着科技的发展,编程已经成为各行各业不可或缺的一部分。在忙碌的工作环境中,如何选择合适的编程工具成为了每个开发者提升工作效率的关键。智能的代码编辑器、强大的版本控制工具、还是那些让你事半功倍的自动化脚本?让我们一起探讨&…

GO入门之值传递于引用(指针、内存地址)传递扫盲

GO入门之值传递于引用(指针、内存地址)传递扫盲 Go 语言中,值传递和引用(指针)传递是两个关键的概念。通过案例可以很好地展示两者的区别。 值传递与引用传递的区别: 值传递:传递的是变量的副…

LabVIEW软件出现Bug如何解决

在LabVIEW开发中,程序出现bug是不可避免的。无论是小型项目还是复杂系统,调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug,包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…

Github 2024-09-26 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10C项目1Prometheus监控系统和时间序列数据库 创建周期:4149 天开发语言:Go协议类型:Apache License 2.0Star数量:52463 个Fork数量:…

WGS1984快速度确定平面坐标系UTM分带(快速套表、公式计算、软件范围判定)

之前我们介绍了坐标系3带6带快速确定带号及中央经线(快速套表、公式计算、软件范围判定)就,讲的是CGCS2000 高斯克吕格的投影坐标系。 那还有我们经常用的WGS1984的平面坐标系一般用什么投影呢? 对于全球全国的比如在线地图使用&#xff1a…

计算机视觉硬件整理(四):相机与镜头参数介绍

文章目录 前言一、工业相机常用分类二、工业相机的基本参数三、工业相机的接口四、工业镜头的参数五、工业镜头的选择要点 前言 随着科技的飞速发展,工业自动化和智能制造在当今社会扮演着越来越重要的角色。在这个背景下,工业相机作为一种关键的视觉检…

python库 | lxml库

1、lxml是一个用C语言编写的Python库,专为解析大型文档和处理复杂的XML文件设计。它提供了快速、易用、功能丰富的接口来处理XML和HTML文档。 2、支持xpath,利用xpath语法,可以快速定位特定元素以及节点信息,提取出html、xml目标数…

面试系列-携程暑期实习一面

Java 基础 1、Java 中有哪些常见的数据结构? 图片来源于:JavaGuide Java集合框架图 Java 中常见的数据结构包含了 List、Set、Map、Queue,在回答的时候,只要把经常使用的数据结构给说出来即可,不需要全部记住 如下&…

SpringBoot集成阿里easyexcel(一)基础导入导出

easyexcel主要用于excel文件的读写&#xff0c;可使用model实体类来定义文件读写的模板&#xff0c;对开发人员来说实现简单Excel文件的读写很便捷。可参考官方文档 https://github.com/alibaba/easyexcel 一、引入依赖 <!-- 阿里开源EXCEL --><dependency><gr…

调用飞书接口导入供应商bug

1、业务背景 财务这边大部分系统都是供应商项目&#xff0c;由于供应商的研发人员没有飞书项目的权限&#xff0c;涉及到供应商系统需求 财务这边都是通过多维表格进行bug的生命周期管理如图&#xff1a; 但多维表格没有跟飞书项目直接关联&#xff0c;测试组做bug统计的时候无…

网络类 面试题-选择题

1、在TCP/IP协议中&#xff0c;A类地址第一个字节的范围是( B ) A、0-126 B、0–127 C、1- 126 D、1—127 2、DHCP 客户端是使用地址(D )来申请一个新的IP地址的 A、0.0.0.1 B、0.0.0.0 C、127. 0.0.1 D、255. 255. 255. 255 3、windows主机中tracert命令的功能是( B C ) A…

redis Redis-Cluster常用命令与Redis性能监控

起因&#xff1a;随着项目的进一步推广&#xff0c;数据量的增大&#xff0c;直接访问mysql数据库获取数据所使用的时间越来越长&#xff0c;为解决当前主要矛盾&#xff0c;决定引入redis非关系型数据库作为缓存层&#xff0c;使得数据并不能直接命中数据库&#xff0c;减少访…

Pytest-allure如何在测试完成后自动生成完整报告?

一、完整步骤 常规allure报告的生成方法是在pytest全部用例执行完成后&#xff0c;手动在命令行执行如 allure generate ./temps -o ./report --clean每次用例执行完成后都要重复如此的操作&#xff0c;十分繁琐。 可以使用如下方式让用例执行完成后自动生成报告到当前目录下…

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序&#xff0c;致敬全 A 的答案&#xff0c;和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数&#xff0c;就想到了二分。然后写一个判…

Linux 挂载硬盘指南

一、挂载磁盘 查看硬盘信息 使用命令 fdisk -l 查看硬盘信息。 新增数据盘执行分区 进入 fdisk 模式对新增数据盘执行分区操作&#xff1a;fdisk /dev/sdb。 新建分区 输入 n 开始新建分区。 创建一个主分区 输入 p 创建一个主分区。 分区编号 选择主分区编号&#xff0c;例…

SSH防止暴力破解

案例&#xff1a;最近公司网站一直被别人暴力破解sshd服务密码。虽然没有成功&#xff0c;但会导致系统负载很高&#xff0c;原因是在暴力破解的时候&#xff0c;系统会不断地认证用户&#xff0c;从而增加了系统资源额外开销&#xff0c;导致访问公司网站速度很慢 fail2ban可以…

【C++】list详解及模拟实现

目录 1. list介绍 2. list使用 2.1 修改相关 2.2 遍历 2.3 构造 2.4 迭代器 2.5 容量相关 2.6 元素访问 2.7 操作相关 3. 模拟实现 3.1 节点类 3.1.1 初始结构 3.1.2 节点的构造函数 3.2 迭代器类 3.2.1 初始结构 3.2.2 迭代器 3.2.3 迭代器-- 3.2.4 解引…

path_provider插件的用法

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…