我想将 secret 数据存储在经过数字签名的文件中,以便我知道其内容何时被篡改。

我最初的想法是,数据将以某种CRC或其他校验和的形式存储在NVP(名称值对)中,以验证内容。

我正在考虑使用ANSI C++实现此类文件的创建(即编写)和验证(读取)。

假设这是我要存储的数据:

    //Unencrypted, raw data to be stored in file
    struct PrivateInfo {
         double age; weight;
         FitnessScale fitness;
         Location  loc;
         OtherStuff stuff;
    };

    //128-bit Encrypted Data (Payload to be stored in file)
    struct EncryptedData {
     // unknown fields/format ??

    };

[在我阅读了有关此问题的一些回复之后]

从我到目前为止收到的评论来看,我担心人们会被“许可”一词所取代,“许可”一词对大多数人来说似乎是一个危险信号。我怀疑可能是这种情况,但是在当今安全和高度紧张的气氛中,我认为我最好详细说明“隐藏”所需的内容,以免有人认为我正在考虑将“Nuke密码”传递给某些人。恐怖分子之类的东西。我现在从问题中删除“许可证”一词。

将其更多地视为技术问题。想象一下,我是一名学生(我是),并且我正在尝试找出推荐的(或最佳做法),以对需要安全的信息进行编码。

考虑到上述情况,我将重新格式化我的问题:
  • 给定结构不同的数据类型字段,给它“合理的安全”加密的“推荐”算法是什么(我仍然更喜欢使用128位-就是我自己)
  • 建议对加密数据提供 ROBUST 检查的推荐方法是什么,因此我可以使用该检查值来了解文件的内容(加密数据的有效载荷)是否不同于原始内容。
  • 最佳答案

    首先,请注意,“签名”数据(以注意何时被篡改)与“加密”数据(以防止其他人读取)是完全独立且独立的操作。

    就是说,OpenPGP标准兼有。 GnuPG是一个流行的实现:http://www.gnupg.org/gph/en/manual.html

    基本上,您需要:

  • 生成密钥对,但是不必费心发布公共(public)部分。
  • 签名并加密数据(这是gpg中的单个操作)
  • ...存储...
  • 解密并检查签名(这也是单个操作)。

  • 但是请注意,只有在您可以比存储其余数据更安全地存储私钥的情况下,这才有用。如果您不能保证密钥的安全性,那么GPG将无法帮助您防止恶意尝试读取或篡改您的数据。而且其他任何加密/签名方案也不能。

    忘记加密,您可能会认为可以使用私钥在某些安全服务器上对数据进行签名,然后使用公钥在某些用户的计算机上对其进行验证。就目前而言,这是可以的,但是如果用户是恶意和聪明的用户,则他们可以发明新数据,使用自己的私钥对其进行签名,并修改您的代码以用其替换您的公钥。他们的数据将随后验证。因此,根据您的威胁模型,您仍然需要公钥的存储是防篡改的。

    您可以自己实现等效项,具体方法如下:
  • 选择一个较长的随机字符字符串。这是你的 key 。
  • 用密钥连接数据。使用安全的哈希函数(SHA-256)对其进行哈希。然后,将所得的哈希与数据连接起来,并使用密钥和安全对称密码(AES)对其进行加密。
  • ...存储...
  • 解密数据,切掉哈希值,放回密钥,对其进行哈希处理,然后将结果与哈希值进行比较以验证其是否已被修改。

  • 与gpg相比,这可能会更快并且总共使用更少的代码:对于初学者来说,PGP是公钥加密,这比您在这里所需要的更多。但是滚动自己意味着您必须做一些工作,编写一些代码,并检查我刚才描述的协议(protocol)中没有一些愚蠢的错误。例如,如果数据的长度不是固定的,则存在潜在的缺陷,这是HMAC可以解决的。

    良好的安全性可以避免其他聪明人为您完成的工作。这是一种良性的懒惰。

    关于c++ - 如何防止文件被篡改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1906691/

    10-11 22:56