避免/检测导出文件的操作

用户名

我正在使用C ++ Qt应用程序。为了在应用程序或所连接的设备出现故障的情况下为用户提供帮助,该程序会导出所有内部设置并将其存储在一个普通文件中(此刻为csv)。然后将该文件发送给公司(例如,每封邮件)。

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

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

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

温斯莫妮卡

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

最简单的方案是使用附加(或预先添加)的私有机密将文件散列到文件的内容,然后将散列附加到文件的末尾。在接收端,您可以跳过哈希,添加机密,重新哈希并进行比较。

如果检查工具应独立且易于使用,则有两种选择:

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

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

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

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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章