生成一些数据的防篡改签名?

我有一个数据。 目前,它是一个XML文件,但架构可能会发生变化。 所以我们暂时假设它是一个C#类。

当我将数据存储在磁盘或数据库中时,我需要添加某种签名或指纹或校验和或其他任何东西,以确保没有人可以修改数据。 警告:即使是有权访问所有源代码的管理员或开发人员也不应该修改它。

我假设由于具有完全代码访问权限的人可以轻松创建新签名(签名需要以编程方式完成,因此无需手动密码短语输入),签名需要包含一些额外的数据。 理想情况下,我应该能够从签名中提取这些数据,例如签名日期和一些字符串。

我的一般方法是使用对称加密。 我从所有字段生成哈希,即SHA-512,然后使用哈希作为密码加密该哈希和我的附加数据以获取我的签名。 要解密,我的函数将从文件中的实际数据生成散列,并尝试解密签名。 这不会是防篡改,因为在签名日期和附加信息仍然完整的情况下生成签名很容易。

由于我不是该领域的专家,我相信我正在尝试重新发明轮子,而且它不是一个非常好的轮子。 我只是想知道是否有一些标准方法? 我相信我的部分请求是不可能的(毕竟,如果有人控制整个环境,那个人也会控制系统时间),但我仍然想知道这通常是如何解决的?

听起来像你想要一个数字签名与安全数字时间戳的组合 。

简而言之,在签署您的数据后,您呼叫第三方Web服务以提供正式时间戳和他们自己的数字签名,将该时间戳链接到您的签名值,从而提供证据certificate原始签名(以及原始数据)是在或者在那个日期之前。 使用此方案,即使原始签名密钥稍后被泄露,撤销或以其他方式无效,由于时间戳,在失效之前所做的任何签名仍然有效。

防篡改硬件签名设备可能会有所帮助。 如果目标硬件是最新的,它可能已经在主板上以TPM的forms提供了一些支持,但是有很多供应商愿意为他们自己的硬件安全模块充电一臂之力 ,或者稍微少一些一张智能卡 。

单靠技术可能无法实现足够的安全性。 您可能需要对系统进行独立validation。 您可能需要远程闭路电视监控和记录机器的位置或其他物理安全措施,以检测或停止篡改。 您可能需要第三方代码托管,审查和签名,以确保计算机上加载的代码是预期的,并阻止和/或检测后门逻辑插入代码中。

最重要的是,你需要花多少钱,时间和精力在很大程度上取决于如果记录是伪造的,你会失去什么。

您需要数字签名和可信时间戳 。 受信任的时间戳会让第三方参与validation消息。 然后任何攻击者都没有对整个系统进行“完全控制”。

您可能希望通过使用GPGME (GnuPG Made Easy)来利用PGP,该库旨在使应用程序更容易访问GnuPG。

Jeffrey Hantin的答案是我认为你能够做到的最好的答案。 但它并不完美:

1)它不会阻止你的黑帽做出完全假的交易。

2)它并没有完全停止篡改交易。 是的,新事务将有不同的时间戳,但如果他们清理相关数据,您如何certificate时间戳已被搞砸? 即使你给他们一些防篡改收据(哈希并在上面签名数据),当谈到摊牌时你如何certificate谁的记录是伪造的?

您需要使用非对称加密技术的数字签名 。

这篇文章似乎有一些很好的例子和解释。

这基本上就是代码签名 ,除了在你的情况下,它不是实际上正在签名的代码。 您必须安排购买证书或设置自己的证书服务器。