C++ 如何防止文件被篡改

C++ 如何防止文件被篡改,c++,encryption,licensing,license-key,C++,Encryption,Licensing,License Key,我想将机密数据存储在一个数字签名的文件中,以便我知道其内容何时被篡改 我最初的想法是,数据将存储在NVPs(名称-值对)中,使用某种CRC或其他校验和来验证内容 我想用ANSI C++()来实现这样一个文件的创建(即编写)和验证(读取)。 假设这是我要存储的数据: //Unencrypted, raw data to be stored in file struct PrivateInfo { double age; weight; Fitne

我想将机密数据存储在一个数字签名的文件中,以便我知道其内容何时被篡改

我最初的想法是,数据将存储在NVPs(名称-值对)中,使用某种CRC或其他校验和来验证内容

我想用ANSI C++(</P>)来实现这样一个文件的创建(即编写)和验证(读取)。 假设这是我要存储的数据:

    //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 ??

    };
[在我阅读了对这个问题的一些回答之后]

从我到目前为止收到的评论来看,我担心人们会被“许可”这个词所左右,这对大多数人来说似乎是个危险信号。我怀疑可能是这样,但在今天高度安全和普遍紧张的气氛中,我认为我最好详细说明我需要“隐藏”的内容,以免有人认为我在考虑将“核密码”传递给恐怖分子或其他什么东西。我现在将从我的问题中删除“许可证”一词

将其更多地视为一个技术问题。假设我是一名学生(我也是),并且我正试图找出关于编码需要安全的信息的建议(或最佳实践)

考虑到上述情况,我将重新安排我的问题:

  • 给定一个不同数据类型字段的结构,“推荐”算法是什么,使其具有“合理的安全”加密(我仍然更喜欢使用128位,但这只是我自己的问题)
  • 建议采用什么方法对加密数据进行健壮的检查,以便我可以使用该检查值来了解文件内容(加密数据的有效负载)是否与原始内容不同

  • 呃,为什么不使用像GPG这样的众所周知的加密系统呢?

    呃,为什么不使用像GPG这样的众所周知的加密系统呢?

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

    也就是说,OpenPGP标准两者兼而有之。GnuPG是一种流行的实现:

    基本上你需要:

    • 生成密钥对,但不要麻烦发布公共部分
    • 对数据进行签名和加密(这是gpg中的单个操作)
    • 。。。存储
    • 解密并检查签名(这也是一个单独的操作)
    但是,请注意,只有当您能够比存储其余数据更安全地存储私钥时,这才有任何用处。如果您不能保证密钥的安全性,那么GPG就无法帮助您抵御恶意读取或篡改数据的企图。任何其他加密/签名方案也不能

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

    您可以自己实现一个等效的,大致如下:

    • 选择一个较长的随机字符字符串。这是你的钥匙
    • 将数据与密钥连接起来。使用安全哈希函数(SHA-256)对此进行哈希。然后将结果散列与数据连接起来,并使用密钥和安全对称密码(AES)对其进行加密
    • 。。。存储
    • 解密数据,切掉散列值,放回密钥,对其进行散列,并将结果与散列值进行比较,以验证其未被修改
    这可能比gpg更快,使用的代码也更少:首先,PGP是公钥加密,这超出了这里的要求。但是滚动你自己的意味着你必须做一些工作,写一些代码,检查我刚才描述的协议中没有愚蠢的错误。例如,如果数据不是固定长度的,它就有潜在的弱点,HMAC解决了这个问题


    良好的安全性可以避免做其他更聪明的人为你做的工作。这是一种有益的懒惰。

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

    也就是说,OpenPGP标准两者兼而有之。GnuPG是一种流行的实现:

    基本上你需要:

    • 生成密钥对,但不要麻烦发布公共部分
    • 对数据进行签名和加密(这是gpg中的单个操作)
    • 。。。存储
    • 解密并检查签名(这也是一个单独的操作)
    但是,请注意,只有当您能够比存储其余数据更安全地存储私钥时,这才有任何用处。如果您不能保证密钥的安全性,那么GPG就无法帮助您抵御恶意读取或篡改数据的企图。任何其他加密/签名方案也不能

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

    您可以自己实现一个等效的,大致如下:

    • 选择一个较长的随机字符字符串。这是你的钥匙
    • 将数据与密钥连接起来。使用安全哈希函数对此进行哈希