1

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

我最初的想法是数据将存储在 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

4 回答 4

10

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

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

基本上你需要:

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

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

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

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

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

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

良好的安全性避免了其他一些更聪明的人为您完成的工作。这是一种有德的懒惰。

于 2009-12-15T11:55:25.057 回答
1

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

于 2009-12-15T11:42:53.523 回答
0

我将改变问题的措辞,看看它是否让人们更快乐(或者我被否决了)。实际上有两种类型的问题被问到:

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

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

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

至于第一个,它又可以被打破。但是校验和是个好主意。请参阅 Amnon 的答案以获取有关此内容的一些链接。

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

于 2009-12-15T12:32:23.847 回答
0

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

对于 q1(加密):如果您在服务器上加密和解密,您可以使用对称密钥算法。否则,您可能想要使用公钥密码术

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

如果数据生成器和验证器都是安全的,您可以使用MAC算法(例如HMAC)来验证数据和 MAC 是否匹配。但这只有在密钥仍然保密的情况下才有效。否则,您也许可以使用数字签名

于 2009-12-15T12:03:03.270 回答