我有一个数据.目前,它是一个XML文件,但架构可能会发生变化.所以我们暂时假设它是一个C#类.
当我将数据存储在磁盘或数据库中时,我需要添加某种签名或指纹或校验和或其他任何内容,以确保没有人可以修改数据.警告:即使是有权访问所有源代码的管理员或开发人员也不应该修改它.
我假设由于具有完全代码访问权限的人可以轻松地创建新签名(签名需要以编程方式完成,因此无需手动密码短语输入),签名在某种程度上需要包含一些其他数据.理想情况下,我应该能够从签名中提取这些数据,例如签名日期和一些字符串.
我的一般方法是使用对称加密.我从所有字段生成哈希,即SHA-512,然后使用哈希作为密码加密该哈希和我的附加数据以获取我的签名.要解密,我的函数会根据文件中的实际数据生成哈希值,并尝试解密签名.这不会是防篡改的,因为很容易生成签名日期和附加信息仍然完整的签名.
由于我不是该领域的专家,我相信我正在尝试重新发明轮子,而且它不是一个非常好的轮子.我只是想知道是否有一些标准方法?我相信我的部分请求是不可能的(毕竟,如果有人控制整个环境,那个人也会控制系统时间),但我仍然想知道这通常是如何解决的?
听起来像你想要一个数字签名与安全数字时间戳的组合.
简而言之,在签署您的数据后,您呼叫第三方Web服务以提供正式时间戳和他们自己的数字签名,将该时间戳链接到您的签名值,从而提供证据证明原始签名(以及原始数据)是在或者在那个日期之前.使用此方案,即使原始签名密钥稍后被泄露,撤销或以其他方式无效,由于时间戳,在失效之前所做的任何签名仍然有效.
防篡改硬件签名设备可能会有所帮助.如果目标硬件是最新的,它可能已经在主板上以TPM的形式提供了一些支持,但是有很多供应商愿意为他们自己的硬件安全模块充电一臂之力,或者稍微少一些一张智能卡.
单靠技术可能无法实现足够的安全性.您可能需要对系统进行独立验证.您可能需要远程闭路电视监控和记录机器的位置或其他物理安全措施,以检测或停止篡改.您可能需要第三方代码托管,审核和签名,以确保计算机上加载的代码符合预期,并阻止和/或检测后门逻辑插入代码.
最重要的是,你需要花多少钱,时间和精力在很大程度上取决于如果记录被伪造你会失去什么.