Public-Key

如何確保客戶端電腦上的文件沒有被客戶端篡改?

  • March 15, 2022

我正在設計一個客戶可以下載到電腦的程序。該程序需要定期與我的線上伺服器同步,以確認客戶的啟動碼尚未過期並且他們正在支付賬單。但是,我希望程序能夠執行長達 5 天而無需連接。如果客戶失去網際網路連接,這將允許客戶使用該程序一段時間。與我的客戶使用的其他程序相比,這將是一個很大的好處,這些程序在沒有網際網路的情況下變得完全無用。

為此,我想將時間戳儲存在本地文本文件中。每次程序執行時,它都會檢查時間戳以查看是否需要線上同步。因此,如果 5 天后沒有線上同步,程序將拒絕啟動,直到客戶端再次同步。

問題是我如何安全地儲存這個文件,這樣客戶端就不能篡改它。如果客戶端可以打開文本文件並更改時間戳,程序可能會被欺騙以為它永遠不必同步。

我考慮了以下幾點:

  1. 在用於加密文本文件的程序中儲存對稱密鑰,然後在需要時對其進行解密以確保其真實性。這裡的問題是對稱密鑰必須固定並儲存在程序中。我是 Java 的新程序員,但據我了解,程序可以反向編譯並獲得對稱密鑰。這個對稱密鑰也可以駐留在記憶體中並被獲取。該程序的所有發行版都必須內置相同的對稱密鑰(我想),這不是一個問題嗎?
  2. 對文件進行簽名以確保真實性的某種方式。我對加密知之甚少,但這聽起來與#1 完全一樣。
  3. 非對稱加密。但我不確定如何在這裡實現。當程序同步時,線上伺服器可以使用公鑰加密時間戳並將其發送回程序以將加密的內容儲存在文件中。然後可以用私鑰解密。這將確保時間戳是由我的伺服器而不是客戶端創建的。問題是任何人都可以使用公鑰加密時間戳並將其放入文件中,因為公鑰是公開的。此外,私鑰必須儲存在程序中,這又回到了與 #1 相同的問題。

甚至有可能實現我想要實現的目標嗎?

問題是我如何安全地儲存這個文件,這樣客戶端就不能篡改它。如果客戶端可以打開文本文件並更改時間戳,程序可能會被欺騙以為它永遠不必同步。

我考慮了以下幾點:

  1. 對文件進行簽名以確保真實性的某種方式。

那將是最接近的;顯而易見的方法是,如果伺服器有一個私人簽名密鑰,而程序有相應的公鑰。然後,當您連接時,伺服器可以對目前時間戳進行簽名,並將該時間戳和簽名發送給客戶端。

然後,當客戶端無法連接時,他會檢查最新下載的時間戳/簽名,並驗證該簽名(使用客戶端安裝的公鑰);如果驗證成功,則檢查時間戳是否不超過五天。

此外,您可以在伺服器簽名的內容中包含一些相關文件(客戶端不應修改的文件)的雜湊值;在驗證時,客戶端將散列其文件副本並將其包含在驗證中。

攻擊者不能修改時間戳,因為他不能修改簽名(並讓它驗證);他可以用以前的時間戳/簽名替換時間戳/簽名,但這不會獲得任何東西。

可能的攻擊方式:

  • 修改’目前時間’;大多數作業系統允許您將時間設置為使用者想要的任何時間。這假設一個經過驗證的(如果不是特別精確)時間戳。
  • 修改程序(修改公鑰,或者更可能的是,用總是說“它是有效的”的東西替換驗證邏輯)。當您在不受信任的計算庫中執行時,這始終是一個問題。

引用自:https://crypto.stackexchange.com/questions/99101