如何防止文件被篡改

时间:2009-12-15 11:03:02

标签: c++ encryption licensing license-key

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

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

我正在考虑使用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密码”传递给某些人恐怖分子什么的。我现在将从我的问题中删除“许可证”一词。

将其视为技术问题。想象一下,我是一名学生(我是),并且我正在尝试找出有关编码需要安全的信息的推荐(或最佳实践)。

考虑到上述情况,我将重新格式化我的问题:

  1. 给定一个不同数据类型字段的结构,什么是“推荐”算法给它一个“合理的安全”加密(我仍然喜欢使用128位 - 但这只是我)
  2. 建议的方法是对加密数据进行 ROBUST 检查,这样我就可以使用该检查值来了解文件的内容(加密数据的有效载荷)是否与原。?

4 个答案:

答案 0 :(得分:9)

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

也就是说,OpenPGP标准同时做到了。 GnuPG是一种流行的实现:http://www.gnupg.org/gph/en/manual.html

基本上你需要:

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

但是,请注意,如果您可以比存储其余数据更安全地存储私钥,那么这只是一种用途。如果您无法保证密钥的安全性,那么GPG无法帮助您防止恶意尝试读取或篡改您的数据。任何其他加密/签名方案都没有。

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

你可以自己实现一个等价物,类似于:

  • 选择一长串随机字符。这是你的关键。
  • 将您的数据与密钥连接起来。使用安全散列函数(SHA-256)对此进行散列。然后将生成的哈希与您的数据连接起来,并使用密钥和安全对称密码(AES)对其进行加密。
  • ......存储......
  • 解密数据,切断哈希值,放回密钥,哈希,并将结果与​​哈希值进行比较,以验证它是否未被修改。

这可能会比gpg更快并且使用更少的代码:对于初学者来说,PGP是公钥加密,这比你在这里需要的要多。但滚动你自己意味着你必须做一些工作,并编写一些代码,并检查我刚刚描述的协议中没有一些愚蠢的错误。例如,如果数据不是固定长度,它有潜在的弱点,HMAC解决了这个问题。

良好的安全性避免了其他一些聪明人为你做过的工作。这是一种善良的懒惰。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

编辑问题的答案取决于具体情况。

对于q1(加密):如果您在服务器上加密和解密,则可以使用symmetric key algorithm。否则,您可能希望使用public key cryptography

对于q2,如果您只想检查文件是否已更改,则可以使用任何cryptographic hash,例如SHA-1 - 假设您可以确保哈希本身没有更改。

如果数据生成器和验证器都是安全的,您可以使用MACHMAC算法来验证数据和MAC是否匹配。但这只有在秘密密钥保密时才有效。 否则,您可以使用digital signatures

答案 3 :(得分:0)

我将改变问题的措辞,看看它是否让人更快乐(或者我被投票)。提出的问题实际上有两类:

  1. 你正在制作一些电脑游戏,你想知道是否有人搞乱你的保存文件。 (数据签名)

  2. 您正在编写一个消息传递程序,并希望将人们的消息日志保密。 (数据加密)

  3. 我将处理第二个(数据加密)。这是一个非常困难的主题,您应该寻找预先构建的程序(例如PGP / GPG),即使这样,您也需要花费大量时间来理解和使用它们。想想这样的加密:它会被打破;你的工作就是不值得努力。换句话说,将其打破所需的努力大于信息的价值。

    至于第一个,它又可以被打破。但校验和是个好主意。请参阅Amnon的答案,了解其中的一些链接。

    希望这能指出你正确的方向。我不是这两个主题的专家,但我希望这给你一个起点。 (你可能想重新说出问题,看看你是否得到了更好的答案)