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

Generate a unique code using date and time

首先抱歉我的英语不好。

我正在做一个项目,我需要生成一个我可以稍后验证的代码(ID)。

由于我的项目非常广泛,我会给你和例子,稍后我需要解决的问题。

示例:我有一个代码每天获取一个地方的温度,数据存储在本地数据库中(我保存温度、日期和唯一 ID)。 代码已加密(任何人都看不到程序的源代码)。

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

我觉得可以解决的是:比如日期是08-19-2017,温度是25°C。我可以做一些数学运算(例如,全部相乘)并得到一个 ID,稍后我可以验证代码是否与日期和温度匹配。

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

谢谢大家。 我正在使用 Python 和 linux.

The code is encrypted (No one can see the source code of the program).

这是谬论。除非您使用的是安全处理器,它实际上可以将内容解密到操作系统无法读取的内存中,否则您的程序永远不会真正加密。当然,原来的 python 可能被隐藏了,但是从汇编中,稍微熟练的人可以很容易地了解正在发生的事情。

因此,由于这是一种数据安全问题:默默无闻的安全性不适用于通用硬件。尤其是像 Python.

这样相对高级的东西

Now my problem. I need to be sure that the data stored in my database has not been modified.

确实是一个难题。问题是:如果有人能够完全重建您的程序状态,他们也可以重建如果数据不同时您的加密会做什么。

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

您需要一些硬件设备来加密您的数据,并证明它没有被篡改,例如通过记录有多少东西被加密了。因此,如果您的数据库中有 100 个东西已被您的安全、不可克隆的加密硬件加密,并且它显示它只被使用了 100 次,那么您就没事了。例如,如果该硬件总是执行“加密(输入字节 + 时间戳)”,则同样适用。

您不能在通用软件中这样做 OS — 软件总是可以 运行 修改数据,如果只是修补访问的物理内存及时。

因此,您需要特定的硬件。感觉像加密智能卡可以做类似的事情,但我不知道它是否包括保持计数器或包括时间戳的功能。

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

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

最后,您使用保存在地窖中的密钥解密数据库中的数据。由于内部状态必然随输入数据而改变(即,对相同数据加密两次不会产生相同结果!!),如果记录中缺少某些内容,则数据无法正确解密。您可以立即通过已知词生成的输出进行检查。


外卖

你想做的事很难——即:

running software on hardware that you have no control over and having to ensure the authenticity of the data it produced.

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