使用日期和时间生成一个唯一的代码

问题描述:

首先抱歉我的英语不好。使用日期和时间生成一个唯一的代码

我正在开发一个项目,我需要生成一个代码(ID),以便日后验证。

由于我的项目非常广泛,我会给你和示例,以后我将需要解决的问题。例如:我有一个代码可以每天获取一个地方的温度,数据存储在本地数据库中(我保存温度,日期和唯一ID)。 代码被加密(没有人可以看到程序的源代码)。

现在我的问题。 我需要确保存储在我的数据库中的数据没有被修改。

我认为可以解决的问题是:例如,日期为08-19-2017,温度为25°C。我可以做一些数学运算(例如,乘以所有)并获得一个ID,稍后我可以验证代码是否匹配日期和温度。

您认为这是一个好的解决方案还是有更好的解决方案?

谢谢大家。 我正在使用Python和Linux。

+0

修改时间?在同一天或之后?你究竟想要保护什么?数据损坏,错误的API或篡改?您可以添加时间戳到您的对象,事务ID,编程它只能写一个新的对象,然后它变成只读。这么多的选项,但很少的信息 – hmedia1

+0

请参阅https://docs.python.org/3/library/uuid.html和https://docs.python.org/3/library/hmac.html –

+0

这听起来像你需要哈希函数,可以映射温度+日期 ID – Miket25

该代码被加密(没有人可以看到该程序的源代码)。

这是一个谬误。除非你使用的是一个安全的处理器,它可以将内存解密到操作系统无法读取的内存中,否则你的程序永远不会真正加密。当然,原始的python可能是隐藏的,但是从汇编中,一个有技能的人可以很容易地收集正在发生的事情。

因此,这是一种数据安全问题:默默无闻的安全性不适用于通用硬件。特别是与Python等相对较高级别的东西无关。

现在我的问题。我需要确保存储在我的数据库中的数据没有被修改。

确实是一个难题。问题在于:如果某人能够完全重建程序的状态,那么他们还可以重建数据不同时加密所做的事情。

有几种解决方法。但最终,它们都分解为一个原则:

您需要一些硬件设备,它可以加密您的数据,并证明它没有被篡改,例如,通过保存已加密了多少东西的计数器。所以,如果你的数据库中有例如100个已经被你的安全的,无法复制的加密硬件加密的东西,并且它显示它只被使用过100次,那么你没事。例如,如果该硬件总是会“加密(输入字节+时间戳)”,则同样适用。

你不能在通用操作系统的软件上做到这点 - 总是可以使用修改后的数据运行软件,并且只需要修补正好及时访问的物理内存。

所以,你需要什么特定的硬件。感觉像加密智能卡可以做类似的事情,但我不知道它是否包含保留计数器或包含时间戳的功能。

可能工作的一个解决方案基本上使用流密码来确保整个数据“流”的完整性。在这里,秘密的一部分是加密算法所在的状态。想象一下:你有一张带有密钥对的智能卡,该密钥对自己在卡上生成。你把另一把钥匙放在你的地窖里。

  1. 在装运设备之前,您先加密一些秘密。这使得智能卡处于恶意篡改者无法猜测的状态。
  2. 您加密第一个值,保存输出。这改变了内部状态!
  3. 您加密并保存已知单词或序列的输出重复2. + 3.对于所有其他要存储的值。

最后,您使用您存储在地下室中的密钥解密数据库中的数据。由于内部状态必然随着输入数据而改变(即,两次加密相同的数据不会得到相同的结果!!),所以如果你从记录中缺少某些东西,数据就不能正确解密。您可以立即通过已知单词生成的输出进行检查。


外卖

什么你想要做的是硬 - 这即是:

上,你有没有控制权,并具有保证的真实性硬件上运行的软件它生成的数据。

现在,不可能的部分实际上是确保数据在进入你的软件之前没有被篡改过 - 谁说,例如,你的温度传感器的驱动程序没有被某些东西总是说“-18°C”?为了避免人们篡改软件的能力,您需要硬件来强制执行非篡改。这不是你可以在PC风格的硬件上做的事情,除非你禁用所有的调试可能性并确保你有安全的启动能力。