我想将 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密码”传递给某些人。恐怖分子之类的东西。我现在从问题中删除“许可证”一词。
将其更多地视为技术问题。想象一下,我是一名学生(我是),并且我正在尝试找出推荐的(或最佳做法),以对需要安全的信息进行编码。
考虑到上述情况,我将重新格式化我的问题:
最佳答案
首先,请注意,“签名”数据(以注意何时被篡改)与“加密”数据(以防止其他人读取)是完全独立且独立的操作。
就是说,OpenPGP标准兼有。 GnuPG是一个流行的实现:http://www.gnupg.org/gph/en/manual.html
基本上,您需要:
但是请注意,只有在您可以比存储其余数据更安全地存储私钥的情况下,这才有用。如果您不能保证密钥的安全性,那么GPG将无法帮助您防止恶意尝试读取或篡改您的数据。而且其他任何加密/签名方案也不能。
忘记加密,您可能会认为可以使用私钥在某些安全服务器上对数据进行签名,然后使用公钥在某些用户的计算机上对其进行验证。就目前而言,这是可以的,但是如果用户是恶意和聪明的用户,则他们可以发明新数据,使用自己的私钥对其进行签名,并修改您的代码以用其替换您的公钥。他们的数据将随后验证。因此,根据您的威胁模型,您仍然需要公钥的存储是防篡改的。
您可以自己实现等效项,具体方法如下:
与gpg相比,这可能会更快并且总共使用更少的代码:对于初学者来说,PGP是公钥加密,这比您在这里所需要的更多。但是滚动自己意味着您必须做一些工作,编写一些代码,并检查我刚才描述的协议(protocol)中没有一些愚蠢的错误。例如,如果数据的长度不是固定的,则存在潜在的缺陷,这是HMAC可以解决的。
良好的安全性可以避免其他聪明人为您完成的工作。这是一种良性的懒惰。
关于c++ - 如何防止文件被篡改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1906691/