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

时间:2009-03-04 03:35:09

标签: c# .net

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

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

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

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

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

6 个答案:

答案 0 :(得分:7)

听起来我想要digital signaturesecure digital timestamp的组合。

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

防篡改硬件签名设备可能有所帮助。如果目标硬件是最新的,它可能已经以TPM的形式在主板上获得了一些支持,但是有很多供应商愿意为自己的{{3}收取费用。对于hardware security modules来说,或者稍微少一些。

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

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

答案 1 :(得分:4)

您需要digital signaturetrusted timestamp。受信任的时间戳会让第三方参与验证消息。然后任何攻击者都没有“完全控制”整个系统。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

Jeffrey Hantin的答案是我认为你能够做到的最好的答案。不过,它 NOT 完美无缺:

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

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

答案 4 :(得分:0)

您希望digital signature使用非对称加密。

article似乎有一些很好的例子和解释。

答案 5 :(得分:0)

这基本上是code signing的内容,除非在您的情况下,实际上并不是签名的代码。您必须安排购买证书或设置自己的证书服务器。