Qt 技巧:利用QCryptographicHash对密码进行加密
项目场景
在一个基于 Qt 开发的聊天应用中,用户注册时需要输入密码。为保障用户密码的安全性,前端在将注册信息通过 HTTP 请求发送到服务器前,必须对明文密码进行加密处理,将加密后的密码写入 JSON 对象中进行传输。
这种做法是现代应用安全设计的基本要求。
问题描述
如果直接将用户输入的明文密码通过网络传输,存在极大的安全隐患。攻击者可能通过抓包等手段获取到用户的明文密码,造成用户信息泄露
项目需求:前端必须对密码加密后再发送
加密的方式有很多,今天我们介绍一个Qt 官方的 QCryptographicHash
类对密码进行加密
QCryptographicHash介绍
QCryptographicHash
是一个QT
官方提供的用于加密的类
它可以帮你把任意数据(比如密码、文件内容等)变成一串定长的指纹(哈希值)。这种指纹有个特点:
1.只要输入内容一样,输出的哈希值就一样
2.只要输入内容有一点点不同,输出就完全不一样
3.不能通过哈希值反推出原始内容(不可逆)
官方提供了许多函数接口供我们使用
这是其中的一个函数接口,可以对data
进行加密
QByteArray hash(QByteArrayView data, QCryptographicHash::Algorithm method)
加密的方法有如下:
常量 | 描述 | Qt 版本 |
---|---|---|
QCryptographicHash::Md4 | 生成 MD4 哈希值 | - |
QCryptographicHash::Md5 | 生成 MD5 哈希值 | - |
QCryptographicHash::Sha1 | 生成 SHA-1 哈希值 | - |
QCryptographicHash::Sha224 | 生成 SHA-224 哈希值 (SHA-2) | Qt 5.0+ |
QCryptographicHash::Sha256 | 生成 SHA-256 哈希值 (SHA-2) | Qt 5.0+ |
QCryptographicHash::Sha384 | 生成 SHA-384 哈希值 (SHA-2) | Qt 5.0+ |
QCryptographicHash::Sha512 | 生成 SHA-512 哈希值 (SHA-2) | Qt 5.0+ |
QCryptographicHash::Sha3_224 / RealSha3_224 | 生成 SHA3-224 哈希值 | Qt 5.1+ |
QCryptographicHash::Sha3_256 / RealSha3_256 | 生成 SHA3-256 哈希值 | Qt 5.1+ |
QCryptographicHash::Sha3_384 / RealSha3_384 | 生成 SHA3-384 哈希值 | Qt 5.1+ |
QCryptographicHash::Sha3_512 / RealSha3_512 | 生成 SHA3-512 哈希值 | Qt 5.1+ |
QCryptographicHash::Keccak_224 | 生成 Keccak-224 哈希值 | Qt 5.9.2+ |
QCryptographicHash::Keccak_256 | 生成 Keccak-256 哈希值 | Qt 5.9.2+ |
QCryptographicHash::Keccak_384 | 生成 Keccak-384 哈希值 | Qt 5.9.2+ |
QCryptographicHash::Keccak_512 | 生成 Keccak-512 哈希值 | Qt 5.9.2+ |
QCryptographicHash::Blake2b_160 | 生成 BLAKE2b-160 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2b_256 | 生成 BLAKE2b-256 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2b_384 | 生成 BLAKE2b-384 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2b_512 | 生成 BLAKE2b-512 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2s_128 | 生成 BLAKE2s-128 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2s_160 | 生成 BLAKE2s-160 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2s_224 | 生成 BLAKE2s-224 哈希值 | Qt 6.0+ |
QCryptographicHash::Blake2s_256 | 生成 BLAKE2s-256 哈希值 | Qt 6.0+ |
MD4、MD5、SHA-1:
这些是比较老的哈希算法,现在已经不安全了,不建议用来加密密码
SHA-2 系列(SHA-224、SHA-256、SHA-384、SHA-512)
目前主流的安全哈希算法,推荐用 SHA-256 或更高版本。
SHA-3、Keccak 系列
更现代的哈希算法,安全性更高,适合对安全要求极高的场景
BLAKE2 系列:
速度快,安全性高,是新一代哈希算法,Qt 6.0 以后才支持
代码实现
//global.h
extern std::function<QByteArray(const QByteArray&)>Hash;//声明
//global.cpp
std::function<QByteArray(const QByteArray&)>Hash=[](const QByteArray& pwd){
QByteArray result=QCryptographicHash::hash(pwd,QCryptographicHash::Sha256);
return result;
};
//注册逻辑层调用
json_obj["passwd"] = QString((Hash(ui->userpwd_edit->text().toUtf8())).toHex());
注意事项
.toUtf8()
: 将 QString
转换为 UTF-8
编码的 QByteArray
.toHex()
: 将哈希得到的二进制数据转成十六进制字符串
二进制数据直接放进 JSON 可能导致乱码或传输错误。
十六进制字符串只包含 0-9 和 a-f,安全、可读、易于传输和存储
顺序:QString → toUtf8() → Hash → toHex() → QString → 写入 JSON
实现效果展示
- 用户输入密码
123456
后,前端自动完成加密,传输内容为哈希值,而非明文。
总结
在 Qt 项目中,利用 QCryptographicHash
类对敏感信息如密码进行哈希加密,是保障数据安全的有效手段。
通过将用户输入的密码转为 UTF-8
编码后进行 SHA-256
哈希,并将结果转为十六进制字符串
传输,可以大幅降低明文泄露风险。
开发建议:
- 优先选择安全性较高的哈希算法(如 SHA-256、SHA-3 系列)。
- 结合 HTTPS 传输,进一步提升安全性。