gpt4 book ai didi

c++ - 避免/检测对导出文件的操纵

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:39 37 4
gpt4 key购买 nike

我正在开发 C++ Qt 应用程序。为了在应用程序或其连接的设备出现故障时帮助用户,程序导出所有内部设置并将它们存储在一个普通文件(目前为 csv)中。然后将此文件发送到公司(例如通过邮件)。

为避免对导出的设置进行不经意的操作(例如,导出后由用户手动操作),我需要某种机制来检测这一点。

方法应该尽可能简单,因为这不是一个非常关键的信息,但仍然有效。

我能想到的就是散列或加密,但我很确定已经有一个简单而优雅的解决方案可用于此。

最佳答案

您可以使用多种摘要或加密签名方案中的一种。由于这必须脱机工作,因此您的可执行文件必须包含一个 secret - 无论是用于公钥加密的公钥,还是其他方式,但您永远无法以这种方式保护自己免受坚定的攻击者的侵害。一个没有逆向工程就无法绕过的简单方案就足够了;如果有人可以进行逆向工程,那么您就完蛋了。

一个最简单的方案是对文件的内容进行哈希处理,并附加(或预先设置)一个私有(private) secret ,并将哈希附加到文件的末尾。在接收端,您跳过散列、添加 secret 、重新散列和比较。

如果检查工具需要独立且简单易用,有两种选择:

  1. 将 Qt 构建为静态链接,并静态链接到 C++ 运行时。然后使用该 Qt 版本构建该工具:它将非常小,不到 1MB,并且没有依赖项。

  2. 将验证器作为单个 html 文件提供,并让它使用 JavaScript File API .用户在他们的 Web 浏览器中打开 html 文件,将文件拖放到拖放区域,并获得即时响应。如今,它可以在任何常见的浏览器上运行,即 Edge、Chrome、Safari、Firefox、Konqueror ......

在 Qt 中执行此操作的一种简单方法是将内容附加到内容的 SHA-256 的十六进制表示中,并附加一个 secret :

static const kHexSealSize = 2+64; // hex SHA-256
static QByteArray kSecret { "Things taste bad without salt." };

QByteArray sealHash(const QByteArray & data, int size = -1) {
if (size < 0) size = data.size();
QCryptographicHash hash(QCryptographicHash::Sha256);
hash.addData(data.constData(), size);
hash.addData(kSecret);
auto seal = QByteArray("\r\n") + hash.result().toHex();
Q_ASSERT(hex.size() == kHexSealSize);
return seal;
}

QByteArray seal(const QByteArray & data) {
return data + sealHash(data);
}

/// Returns whether a seal is valid
bool checkSeal(const QByteArray & data) {
if (data.size() < kHexSealSize) return false;
auto hexSrc = data.right(kHexSealSize);
auto hexCmp = sealHash(data, data.size() - kHexSealSize);
return hexSrc == hexCmp;
}

关于c++ - 避免/检测对导出文件的操纵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986790/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com