我有一份数据。目前,它是一个XML文件,但架构可能会发生变化。因此,让我们暂时假设它是一个C#类。
当我将数据存储在磁盘或数据库中时,我需要添加某种签名或指纹或校验和或任何东西,以确保没有人可以修改数据。警告:即使管理员或开发人员有权访问所有源代码,也不应该能够对其进行修改。
我假设,由于拥有完全代码访问权限的人可以轻松地创建新的签名(签名需要通过编程完成,因此不需要手动输入密码),签名需要以某种方式包含一些额外的数据。理想情况下,我应该能够从签名中提取这些数据,例如签名日期和一些字符串。
我的一般方法是使用对称加密。我从所有字段生成一个散列,即SHA-512,然后使用该散列作为密码对该散列和我的附加数据进行加密,以获得我的签名。为了解密,我的函数将从文件中的实际数据生成散列,并尝试解密签名。但这不是防篡改的,因为在签名日期和附加信息仍然完好无损的情况下生成签名是很容易的。
由于我不是这个领域的专家,我相信我正在尝试重新发明轮子,而且它不是一个非常好的轮子。我只是想知道是否有一些标准的方法?我相信我的部分请求是不可能的(毕竟,如果有人控制了整个环境,那么这个人也控制了系统时间),但我仍然想知道通常是如何处理这一问题的?
发布于 2009-03-04 03:55:56
在我看来,您想要的是digital signature和secure digital timestamp的组合。
简而言之,在对您的数据进行签名之后,您可以调用第三方web服务来提供官方时间戳和他们自己的数字签名,从而将该时间戳与您的签名值联系起来,从而提供原始签名(以及原始数据)是在该日期或之前创建的证据。使用该方案,即使原始签名密钥后来被泄露、撤销或以其他方式无效,在无效之前所做的任何签名仍然有效,这要归功于时间戳。
防篡改的硬件签名设备可能会有所帮助。如果目标硬件相当新,它可能已经在主板上以TPM的形式提供了一些支持,但有很多供应商愿意为自己的hardware security modules收取高昂的费用,或者为smart card收取更低的费用。
仅靠技术可能无法实现足够的安全性。您可能需要对系统进行独立验证。您可能需要远程CCTV监控和记录机器的位置或其他物理安全措施来检测或停止篡改。您可能需要第三方代码托管、审查和签名,以确保加载到计算机上的代码符合预期,并阻止和/或检测后门逻辑插入代码。
底线是,你需要在这上面花费多少钱,时间和精力,这在很大程度上取决于如果记录被伪造,你会损失什么。
发布于 2009-03-04 03:55:32
您需要同时使用digital signature和trusted timestamp。受信任的时间戳让第三方参与验证消息。那么任何攻击者都不能“完全控制”整个系统。
发布于 2009-03-04 04:06:06
您可能希望通过使用GPGME (GnuPG make Easy)来利用PGP,这是一个旨在使应用程序更容易访问GnuPG的库。
https://stackoverflow.com/questions/609127
复制相似问题