首先抱歉我的英语不好。
我正在开发一个项目,我需要生成一个我可以稍后验证的代码(ID)。
由于我的项目非常广泛,我将为您提供示例,以及我需要解决的问题。
示例:我有一个代码可以每天获取一个地方的温度,数据存储在本地数据库中(我保存温度,日期和唯一ID)。 代码是加密的(没有人可以看到程序的源代码)。
现在我的问题。 我需要确保我的数据库中存储的数据没有被修改。
我认为可以解决的问题是:例如,日期是08-19-2017,温度是25°C。我可以做一些数学运算(例如,乘以所有)并得到一个ID,稍后我可以验证代码是否与日期和温度相匹配。
你认为这是一个很好的解决方案还是有更好的解决方案?
谢谢大家。 我正在使用Python和Linux。
答案 0 :(得分:1)
代码已加密(没有人可以看到程序的源代码)。
这是一个谬论。除非您使用的安全处理器实际上可以将内容解密到操作系统无法读取的内存中,否则您的程序永远不会真正加密。当然,最初的蟒蛇可能是隐藏的,但是从装配中,有些熟练的人可以很容易地收集正在发生的事情。
因此,这是一种数据安全问题:默默无闻的安全性不适用于通用硬件。尤其是Python等相对较高级别的东西。
现在我的问题。我需要确保我的数据库中存储的数据没有被修改。
确实 是一个难题。问题在于:如果某人能够完全重建您的程序状态,他们还可以重建您的加密在数据不同时所做的事情。
有几种解决方法。但最终,它们都归结为一个原则:
您需要一些可以对数据进行加密的硬件设备,并证明它没有被篡改,例如:通过计算已加密的内容的计数器。因此,如果您在数据库中有100个由安全,不可克隆的加密硬件加密的东西,并且它显示它只被使用了100次,那么你没问题。如果该硬件例如总是“加密(输入字节+时间戳)”,则同样适用。
你不能在通用操作系统的软件中做到这一点 - 软件总是可以用修改后的数据运行,如果只是你修补了及时访问的物理内存。
那么,你需要什么特定的硬件。像加密智能卡这样的感觉可以做类似的事情,但我不知道这是否包括保留计数器或包含时间戳的功能。
可能有效的一个解决方案基本上是使用流密码来确保整个数据“流”的完整性。在这里,秘密的一部分是加密算法所处的状态。想象一下:你有一张智能卡,上面有卡片上生成的密钥对的密钥。你把另一把钥匙放在地窖里。
最后,您使用保存在地窖中的密钥解密数据库中的数据。由于内部状态必然随输入数据而改变(即两次加密相同的数据不会产生相同的结果!!),如果记录中缺少某些内容,则数据无法正确解密。您可以通过已知单词生成的输出立即检查。
你要做的事情很难 - 就是:
在您无法控制的硬件上运行软件,并且必须确保其生成的数据的真实性。
现在,不可能的部分实际上确保数据在进入软件之前没有被篡改 - 例如,温度传感器的驱动程序没有被总是说“ -18°C“?为了避免人们篡改您的软件的能力,您将需要强制执行非篡改的硬件。除非您禁用所有调试功能并确保具有安全的启动功能,否则这不是您可以在PC式硬件上执行的操作。