我想将机密数据存储在数字签名文件中,以便我知道其内容何时被篡改。
我最初的想法是,数据将存储在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密码”传递给某些人恐怖分子什么的。我现在将从我的问题中删除“许可证”一词。
将其视为技术问题。想象一下,我是一名学生(我是),并且我正在尝试找出有关编码需要安全的信息的推荐(或最佳实践)。
考虑到上述情况,我将重新格式化我的问题:
答案 0 :(得分:9)
首先,请注意“签名”数据(通知何时被篡改)是一种完全独立且独立的“加密”数据操作(以防止其他人阅读)。
也就是说,OpenPGP标准同时做到了。 GnuPG是一种流行的实现:http://www.gnupg.org/gph/en/manual.html
基本上你需要:
但是,请注意,如果您可以比存储其余数据更安全地存储私钥,那么这只是一种用途。如果您无法保证密钥的安全性,那么GPG无法帮助您防止恶意尝试读取或篡改您的数据。任何其他加密/签名方案都没有。
忘记加密,您可能认为可以使用私钥在某个安全服务器上签名数据,然后使用公钥在某个用户的计算机上验证它。这很好,但如果用户是恶意和聪明的,那么他们可以发明新数据,使用他们自己的私钥签名,并修改代码以替换他们的公钥。然后他们的数据将被验证。因此,根据您的威胁模型,您仍然需要存储公钥以防篡改。
你可以自己实现一个等价物,类似于:
这可能会比gpg更快并且使用更少的代码:对于初学者来说,PGP是公钥加密,这比你在这里需要的要多。但滚动你自己意味着你必须做一些工作,并编写一些代码,并检查我刚刚描述的协议中没有一些愚蠢的错误。例如,如果数据不是固定长度,它有潜在的弱点,HMAC解决了这个问题。
良好的安全性避免了其他一些聪明人为你做过的工作。这是一种善良的懒惰。
答案 1 :(得分:1)
呃,为什么不使用像GPG这样众所周知的加密系统?
答案 2 :(得分:0)
编辑问题的答案取决于具体情况。
对于q1(加密):如果您在服务器上加密和解密,则可以使用symmetric key algorithm。否则,您可能希望使用public key cryptography。
对于q2,如果您只想检查文件是否已更改,则可以使用任何cryptographic hash,例如SHA-1 - 假设您可以确保哈希本身没有更改。
如果数据生成器和验证器都是安全的,您可以使用MAC等HMAC算法来验证数据和MAC是否匹配。但这只有在秘密密钥保密时才有效。 否则,您可以使用digital signatures。
答案 3 :(得分:0)
我将改变问题的措辞,看看它是否让人更快乐(或者我被投票)。提出的问题实际上有两类:
你正在制作一些电脑游戏,你想知道是否有人搞乱你的保存文件。 (数据签名)
您正在编写一个消息传递程序,并希望将人们的消息日志保密。 (数据加密)
我将处理第二个(数据加密)。这是一个非常困难的主题,您应该寻找预先构建的程序(例如PGP / GPG),即使这样,您也需要花费大量时间来理解和使用它们。想想这样的加密:它会被打破;你的工作就是不值得努力。换句话说,将其打破所需的努力大于信息的价值。
至于第一个,它又可以被打破。但校验和是个好主意。请参阅Amnon的答案,了解其中的一些链接。
希望这能指出你正确的方向。我不是这两个主题的专家,但我希望这给你一个起点。 (你可能想重新说出问题,看看你是否得到了更好的答案)