如何防止文件被篡改

Sti*_*MAN 1 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 ??

    };
Run Code Online (Sandbox Code Playgroud)

[在我阅读了这个问题的一些回复之后]

从我迄今收到的评论来看,我担心人们会被"许可"这个词跟踪,这似乎是大多数人的一面红旗.我怀疑可能是这种情况,但在今天的安全性和普遍紧张的气氛中,我想我会更好地详述我需要"隐藏"的东西,以免有人认为我想把"Nuke密码"传递给某些人恐怖分子什么的.我现在将从我的问题中删除"许可"一词.

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

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

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

Ste*_*sop 9

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

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

基本上你需要:

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

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

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

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

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

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

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