2017-08-19 73 views
0

首先抱歉我的英語不好。使用日期和時間生成一個唯一的代碼

我正在開發一個項目,我需要生成一個代碼(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

回答

1

該代碼被加密(沒有人可以看到該程序的源代碼)。

這是一個謬誤。除非你使用的是一個安全的處理器,它可以將內存解密到操作系統無法讀取的內存中,否則你的程序永遠不會真正加密。當然,原始的python可能是隱藏的,但是從彙編中,一個有技能的人可以很容易地收集正在發生的事情。

因此,這是一種數據安全問題:默默無聞的安全性不適用於通用硬件。特別是與Python等相對較高級別的東西無關。

現在我的問題。我需要確保存儲在我的數據庫中的數據沒有被修改。

確實是一個難題。問題在於:如果某人能夠完全重建程序的狀態,那麼他們還可以重建數據不同時加密所做的事情。

有幾種解決方法。但最終,它們都分解爲一個原則:

您需要一些硬件設備,它可以加密您的數據,並證明它沒有被篡改,例如,通過保存已加密了多少東西的計數器。所以,如果你的數據庫中有例如100個已經被你的安全的,無法複製的加密硬件加密的東西,並且它顯示它只被使用過100次,那麼你沒事。例如,如果該硬件總是會「加密(輸入字節+時間戳)」,則同樣適用。

你不能在通用操作系統的軟件上做到這點 - 總是可以使用修改後的數據運行軟件,並且只需要修補正好及時訪問的物理內存。

所以,你需要什麼特定的硬件。感覺像加密智能卡可以做類似的事情,但我不知道它是否包含保留計數器或包含時間戳的功能。

可能工作的一個解決方案基本上使用流密碼來確保整個數據「流」的完整性。在這裏,祕密的一部分是加密算法所在的狀態。想象一下:你有一張帶有密鑰對的智能卡,該密鑰對自己在卡上生成。你把另一把鑰匙放在你的地窖裏。

  1. 在裝運設備之前,您先加密一些祕密。這使得智能卡處於惡意篡改者無法猜測的狀態。
  2. 您加密第一個值,保存輸出。這改變了內部狀態!
  3. 您加密並保存已知單詞或序列的輸出重複2. + 3.對於所有其他要存儲的值。

最後,您使用您存儲在地下室中的密鑰解密數據庫中的數據。由於內部狀態必然隨着輸入數據而改變(即,兩次加密相同的數據不會得到相同的結果!!),所以如果你從記錄中缺少某些東西,數據就不能正確解密。您可以立即通過已知單詞生成的輸出進行檢查。


外賣

什麼你想要做的是硬 - 這即是:

上,你有沒有控制權,並具有保證的真實性硬件上運行的軟件它生成的數據。

現在,不可能的部分實際上是確保數據在進入你的軟件之前沒有被篡改過 - 誰說,例如,你的溫度傳感器的驅動程序沒有被某些東西總是說「-18°C」?爲了避免人們篡改軟件的能力,您需要硬件來強制執行非篡改。這不是你可以在PC風格的硬件上做的事情,除非你禁用所有的調試可能性並確保你有安全的啓動能力。

相關問題