【Qt】QCryptographicHash 设置密钥(Key)

QCryptographicHash 本身不能设置密钥(Key)。

它是一个用于计算非密钥型加密哈希的函数,其设计目的和 HMAC 或加密算法完全不同。

下面我详细解释为什么,以及如何正确地实现你可能想要的功能。

1. QCryptographicHash 的核心功能:无密钥哈希

QCryptographicHash 的核心功能是接受输入数据(如一个字符串或文件内容),然后输出一个固定长度的、唯一的哈希值(摘要)。相同的输入永远产生相同的输出

  • 输入:数据 (Data)
  • 输出:哈希值 (Hash/Digest)
  • 特点不需要密钥。任何人都可以用这个类计算出相同数据的相同哈希值。

它的典型用途是:

  • 验证文件下载是否完整(计算下载文件的 SHA256 并与官方提供的哈希值对比)。
  • 生成数据的唯一标识符。
  • 用于数字签名流程的一部分(签名是使用私钥对数据的哈希值进行加密,而不是直接加密数据本身)。

2. 如果你需要“带密钥的哈希”,你需要的是 HMAC

当你想要验证一段数据不仅完整,而且来自可信的来源(即拥有密钥的人)时,就需要用到密钥。这就是 HMAC 的用途。

  • 输入:数据 (Data) + 密钥 (Secret Key)
  • 输出:消息认证码 (MAC)
  • 特点必须要有密钥。只有拥有相同密钥的人才能计算出相同的 MAC 值。

它的典型用途是:

  • API 请求认证:客户端使用密钥对请求参数生成一个签名(HMAC),服务器用同样的密钥验证签名,从而确认请求是合法的、未被篡改。
  • JSON Web Tokens (JWT):JWT 的签名部分就是使用 HMAC 生成的。
  • 任何需要同时保证完整性和真实性的场景。

3. 如何在 Qt 中实现 HMAC(带密钥的哈希)

Qt 提供了专门的类 QMessageAuthenticationCode 来计算 HMAC。你应该使用这个类,而不是 QCryptographicHash

示例:使用 QMessageAuthenticationCode 计算 HMAC-SHA256
#include <QMessageAuthenticationCode>
#include <QDebug>int main() {// 你的原始消息QByteArray message = "Important data: user=123, action=delete";// 你的密钥(必须保密!)QByteArray secretKey = "MySuperSecretKey123!";// 选择哈希算法(这里以 SHA256 为例)QCryptographicHash::Algorithm hashAlgorithm = QCryptographicHash::Sha256;// 计算 HMACQMessageAuthenticationCode hmacCalculator(hashAlgorithm);hmacCalculator.setKey(secretKey);       // 设置密钥hmacCalculator.addData(message);        // 添加数据QByteArray result = hmacCalculator.result(); // 计算最终结果QByteArray hmacHex = result.toHex();    // 转换为十六进制字符串,便于传输和存储qDebug() << "Message:" << message;qDebug() << "HMAC (hex):" << hmacHex;// 输出类似: "HMAC (hex): a1b2c3d4e5f6..."// --- 验证端 --- //// 当接收方收到消息和这个HMAC后,可以用同样的密钥和算法重新计算一次HMAC。// 如果计算出的HMAC与发送来的完全一致,则证明消息是完整且真实的。return 0;
}

4. 一个常见的混淆:加密 (Encryption) vs. 哈希 (Hashing)

你可能还会想问:“那我可以用它来加密密码吗?” 答案是:不能,而且这是两个截然不同的概念

  • 哈希 (Hashing with QCryptographicHash)

    • 单向的:无法从哈希值还原出原始数据。
    • 目的:验证完整性、生成指纹。
    • 例如:SHA256, MD5。
  • 加密 (Encryption)

    • 双向的:使用密钥将明文变为密文,也可以使用密钥(或配对密钥)将密文还原为明文。
    • 目的:保密性,防止信息被未授权者读取。
    • 例如:AES, RSA。

对于密码存储,正确的做法是使用密码学哈希函数,但必须是专门为密码设计的(如 bcrypt, PBKDF2),而不是 QCryptographicHash 这种通用哈希。Qt 中可以使用 QPasswordDigestor(详见我上一个回答)。

总结

| 你的需求 | 应该使用的 Qt 类 | 说明 |
| :— | :— | :— |
| 计算数据的哈希值(校验文件完整性) | QCryptographicHash | 无密钥,通用哈希计算。 |
| 计算带密钥的哈希(API签名,消息认证) | QMessageAuthenticationCode (HMAC) | 需要密钥,用于验证真实性和完整性。 |
| 加密/解密数据(保证数据机密性) | 需要使用加密库(如 Qt 的 QSslSocket 相关功能或第三方库) | 需要密钥,双向过程。 |
| 安全地存储用户密码 | QPasswordDigestor (Qt >= 5.12) | 使用慢哈希算法(如 PBKDF2),内含盐值和迭代次数。 |

结论:
QCryptographicHash 没有设置密钥的功能。 如果你需要用到密钥,你的真实需求很可能是:

  1. 消息认证 -> 使用 QMessageAuthenticationCode (HMAC)。
  2. 加密数据 -> 使用加密库(如 AES)。
  3. 哈希密码 -> 使用 QPasswordDigestor

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

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

相关文章

2025板材十大品牌客观评估报告—客观分析(三方验证权威数据)

随着消费者环保意识提升&#xff0c;板材作为家装基础材料的性能指标受到广泛关注。中国林产工业协会数据显示&#xff0c;2025年国内环保板材市场规模约860亿元&#xff0c;但行业标准执行不一&#xff0c;消费者面临信息不对称问题。本报告严格依据可验证的第三方数据&#x…

诊断通信管理(Diagnostic Communication Management)详解

—— 基于《Specification of Diagnostics AUTOSAR AP R24-11》(SWS_Diagnostics.pdf) 诊断通信管理(Diagnostic Communication Management)是 AUTOSAR 自适应平台诊断管理(Diagnostic Management,DM)的核心功能模块之一,位于应用层,承担 “诊断客户端与诊断服务器实…

vue拖动排序,vue使用 HTML5 的draggable拖放 API实现内容拖并排序,并更新数组数据

vue拖动排序&#xff0c;vue使用 HTML5 的draggable拖放 API实现内容拖并排序&#xff0c;并更新数组数据 vue使用 HTML5 的draggable拖放 API实现内容拖并排序&#xff0c;并更新数组数据 实现效果实现代码1.模板部分2. 添加拖拽相关方法3. 在 data 中添加拖拽状态变量4. 添加…

行内元素块元素

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>显示例子</title><style>/* 将行内元素…

算法---动态规划(持续更新学习)

1.动态规划的经典问题 &#xff08;1&#xff09;动规基础&#xff1a;爬楼梯、斐波那契数列 &#xff08;2&#xff09;背包问题&#xff1a;0-1背包&#xff0c;多重背包 &#xff08;3&#xff09;打家劫舍 &#xff08;4&#xff09;股票问题 &#xff08;5&#xff09;子序…

迅睿CMS自定义网站表单:HTML方式调用Select下拉选项数据指南

在迅睿CMS中&#xff0c;当我们需要自定义网站表单并希望以HTML方式调用select下拉选项数据时&#xff08;而非使用系统默认的{$myfield}、{$diyfield}或{$sysfield}模板变量&#xff09;&#xff0c;可以采用以下方法实现。 问题背景 默认情况下&#xff0c;迅睿CMS表单字段通…

k8s--efk日志收集

目录 环境准备 下载efk软件包 下载 nfs 设置nfs开机自启 创建共享存储目录 配置共享目录文件 加载nfs 使共享目录生效 查看 node节点验证 共享目录配置成功 进入efk配置文件目录 修改deployment.yaml文件 修改为master主节点ip 修改为nfs共享存储目录 修改 kibana …

数值分析——算法的稳定性

由于计算时&#xff0c;误差会有累积&#xff0c;如果是长时间的计算&#xff0c;就会影响最后得到的结果&#xff0c;因此&#xff0c;需要分析一下误差的影响能否控制&#xff0c;由此就引出了算法的稳定性 数值的稳定性 对于某一种算法&#xff0c;如果初始值有很小的误差&a…

解密 Kotlin 中的隐藏调度器:Dispatchers.Main.immediate

在日常的 Android 开发中&#xff0c;我们经常使用协程来处理异步任务。你可能已经熟悉了 Dispatchers.Main、Dispatchers.IO 和 Dispatchers.Default&#xff0c;但今天我要介绍一个不太为人知却极其有用的调度器&#xff1a;Dispatchers.Main.immediate。 一个令人困惑的现象…

I2C多点触控驱动开发详解

I2C多点触控驱动开发详解 1. 多点触控技术概述 1.1 触控技术发展历程 触控技术作为人机交互的重要方式&#xff0c;经历了从单点触控到多点触控的演进过程。早期的电阻式触控屏只能实现单点触控&#xff0c;限制了用户体验。随着电容式触控技术的发展&#xff0c;多点触控成为可…

UE5提升分辨率和帧率的方法

提问&#xff1a;分辨率大概理解就是是否模糊&#xff0c;帧率大概理解就是是否卡顿对吗 回答 没错&#xff0c;一句话总结&#xff1a; 分辨率主要影响“看起来糊不糊”&#xff1b; 帧率与帧时间稳定性主要影响“顺不顺”。 如何快速提升UE5的分辨率&#xff1f; 是的&…

小狼毫输入法中让数字键盘上的数字键不再选择候选词而是与原始输入一起直接上屏

使用搜狗输入法的双拼时&#xff0c;输入“womf”然后按下主键盘上的数字1&#xff0c;会选择排名第一的候选词上屏&#xff08;大概率是“我们&#xff09;&#xff0c;输入“womf”然后按下数字键盘上的数字1&#xff0c;不会选择候选词&#xff0c;而是将输入文本变成“womf…

【C++】类和对象(终章)

作者主页&#xff1a;lightqjx 本文专栏&#xff1a;C 目录 一、构造函数 1. 构造函数体赋值 2. 初始化列表 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;使用特性 3. explicit关键字 二、static成员 1. 概念 2. 特性 3. 应用 三、友元 1. 友元函…

水果目标检测[2]:ALAD-YOLO:一种轻便、精确的苹果叶病检测仪

原文&#xff1a; 目录 摘要&#xff1a; ALAD-YOLO的改进&#xff1a; 1.轻量化主干网络&#xff1a; 2.改进的 Neck 网络&#xff1a; 3.改进的 SPP 模块&#xff1a; 4.注意力机制引入&#xff1a; 实验结果 数据&#xff1a; 1 数据采集 (Data Collection) 2 数…

Let‘s Encrypt证书自动续期

证书失效后浏览器可以看到错误提示&#xff0c;以及证书过期时间。 排查服务器证书续期配置 1. 证书未正确安装或配置 确保在阿里云服务器上部署的 Let’s Encrypt 证书已经正确安装。你可以通过以下步骤确认&#xff1a; 使用命令 sudo certbot certificates 检查证书是否正确…

Redis-基数统计、位图、位域、流

Redis-基数统计、位图、位域、流一、基数统计 HyperLogLog二、位图 Bitmap三、位域 Bitfild四、流 Stream一、基数统计 HyperLogLog 基数统计:是用来做基数(不重复的数)统计的算法 &#xff08;统计不重复出现的数据的个数&#xff09; 基数统计VS集合 集合&#xff1a; uv …

IBMS-建筑内分散的子系统(如 BA、安防、消防、能源、电梯等)进行数据互联、功能协同与智能管控

IBMS&#xff08;Integrated Building Management System&#xff0c;楼宇集成管理系统&#xff09;并非简单的 “系统叠加”&#xff0c;而是通过对建筑内分散的子系统&#xff08;如 BA、安防、消防、能源、电梯等&#xff09;进行数据互联、功能协同与智能管控&#xff0c;实…

LabVIEW温采监控系统

​温度采集监控系统以LabVIEW 软件平台&#xff0c;构建起一套高效、可靠的温度监测与控制体系。系统可实时采集、显示、存储温度数据&#xff0c;超限时自动报警并执行温控操作&#xff0c;适用于多类场景&#xff0c;能满足精准温控需求&#xff0c;解决传统系统灵活性差、成…

Docker核心概念与镜像仓库操作指南

文章目录一、名词概念Docker镜像Docker镜像仓库二、Docker镜像仓库常用命令三、容器启动相关指令Nginxdocker rundocker ps四、综合实例1.搭建Nginx服务2.Docker hub上创建私有仓库一、名词概念 Docker镜像 Docker 镜像&#xff1a;是一个只读的模板&#xff0c;它包含了创建…

科技信息差(8.30)

&#x1f30d;DeepSeek V3.1 Base突袭上线&#xff01;击败Claude 4编程爆表&#xff0c;全网在蹲R2和V4&#x1f384;语音界Sora&#xff01;微软刚开源新模型&#xff0c;一次生成90分钟语音、3200倍压缩率VibeVoice-1.5B开创了语音界多个重大技术突破&#xff1a;一次性可连…