You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用QT实现SHA256withRSA签名以适配Google服务账号?

刚好我之前做过Google服务账号的JWT认证,用Qt实现SHA256withRSA签名其实没那么复杂,我给你一步步拆解清楚:

用Qt实现SHA256withRSA签名(适配Google服务账号)

首先得明确:SHA256withRSA不是直接加密内容,而是先对目标内容做SHA256哈希,再用RSA私钥对哈希值进行签名——这正是Google服务账号JWT认证的核心环节。你已经有了base64编码的header和payload,接下来按以下步骤操作即可:

1. 加载Google服务账号的RSA私钥

Google给的私钥是PEM格式的(.pem文件),Qt的QSslKey可以直接加载它,注意要指定正确的密钥类型:

QString privateKeyPath = "/path/to/your/service-account-key.pem";
QFile keyFile(privateKeyPath);
if (!keyFile.open(QIODevice::ReadOnly)) {
    qDebug() << "Failed to open private key file";
    return;
}

QByteArray privateKeyData = keyFile.readAll();
QSslKey rsaPrivateKey(privateKeyData, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);

if (!rsaPrivateKey.isValid()) {
    qDebug() << "Invalid RSA private key - check if your PEM file is intact";
    return;
}

⚠️ 注意:私钥文件里的-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----必须保留,不能修改或删除。

2. 拼接待签名的原始内容

把你已经做好的URL安全Base64编码的header和payload,用英文点号.拼接起来——这才是我们要签名的目标数据:

// 替换成你自己的base64 header和payload
QString base64Header = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9";
QString base64Payload = "eyJpc3MiOiJ..."; 
QByteArray unsignedData = QString("%1.%2").arg(base64Header, base64Payload).toUtf8();

⚠️ 这里的base64必须是URL安全格式:把+换成-,/换成_,去掉末尾的=,否则Google会拒绝验证。

3. 执行SHA256withRSA签名

Qt 5.10+版本的QSslKey提供了sign方法,可以直接完成「SHA256哈希+RSA签名」的组合操作,不用分开处理:

QByteArray signature = rsaPrivateKey.sign(unsignedData, QCryptographicHash::Sha256);
if (signature.isEmpty()) {
    qDebug() << "Signature failed - check your private key and input data";
    return;
}

4. 把签名转换成URL安全的Base64

最后把二进制的签名数据转换成URL安全的Base64编码,就得到了JWT的第三部分:

QString base64Signature = signature.toBase64();
// 转换为URL安全格式
base64Signature.replace('+', '-');
base64Signature.replace('/', '_');
base64Signature.remove('=');

// 最终的JWT就是 header.payload.signature
QString finalJwt = QString("%1.%2.%3").arg(base64Header, base64Payload, base64Signature);
qDebug() << "Generated JWT:" << finalJwt;

额外注意事项

  • 如果你的Qt版本低于5.10,QSslKey::sign方法不存在,这时候可以考虑引入QCA(Qt Cryptographic Architecture)库来实现签名逻辑,不过更推荐升级到较新的稳定Qt版本。
  • 测试的时候可以用Google的JWT验证工具(本地验证即可)来检查生成的JWT是否有效,确保签名步骤没问题。

内容的提问来源于stack exchange,提问作者Calypoter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:01