Public-Key
驗證消息到嵌入式設備
我正在建構一個我計劃分發的嵌入式設備。設備會定期輪詢我的伺服器以檢查更新和命令。我希望設備驗證任何消息(由 Go 編寫的客戶端解析的 JSON 字元串)和更新實際上來自我。
我的計劃是使用 Go 的 crypto/ecdsa 庫為每個設備生成一個私鑰/公鑰對,將公鑰儲存在嵌入式設備上,並使用私鑰對每條消息進行簽名。然後,設備將使用其公鑰驗證任何收到的消息。
從我目前了解到的情況來看,RNG(在簽署消息的伺服器上)似乎是一個潛在的弱點。還有其他我遺漏的明顯缺陷/問題嗎?
由於您通常問“我是否還缺少其他明顯的缺陷/問題”,所以我建議您對整個更新流程進行批判性研究。我不會認為您伺服器上 PRNG 的質量是一個明顯的弱點,只要它相當強大,因為在伺服器上,您可以選擇相當多的相當好的常式來生成公平的 PRN(請注意,它是在正常伺服器或客戶端機器上生成一對好的 PGP 密鑰是完全可以接受的)。
對整個更新過程的批判性審查應考慮以下清單,但絕不是詳盡的清單:
- 向公共網際網路開放的伺服器通常會表現出相當廣泛的攻擊面——作業系統、應用程序、服務、開放埠等。如果我是攻擊者,我會首先嘗試侵入你的伺服器,並在那裡使用你的私鑰發送惡意更新命令。
- 您需要保護嵌入式處理器的環境。我假設您不考慮直接物理訪問嵌入式系統的可能性(否則所有安全賭注都已關閉),但您確實需要考慮其他問題,例如攻擊者生成的簽名嚴重的消息淹沒設備的通信通道,從而導致嵌入式系統上的 DOS。您可以使用看門狗計時器來緩解這種情況,該計時器將在設定的時間後終止更新循環。
- 我同意 maeher - 質疑為每個設備生成密鑰對的必要性。對於私鑰洩露的可能性,這將是管理層的噩夢:您將如何遠端辨識客戶端,以便知道使用哪個私鑰來簽名去該特定客戶端?你會為每個客戶發送一堆記錄來測試它們,以便在它們中找到一個公認的信號嗎?您會首先以明文形式發送客戶 ID 並以適當的簽名消息進行響應嗎?正如 maeher 建議的那樣,我還建議與所有客戶端的一對密鑰將具有相同的公鑰。
如果您真的擔心有人竊取您的私鑰,您可能需要考慮讓所有密鑰在每次更新後都過期,並為下一個更新周期重新生成一個新密鑰對(新密鑰對將在過期前由舊密鑰簽名)。這不像每個客戶的獨特配對那樣強大,但肯定更易於管理。
當您考慮上述情況時,如果您的嵌入式應用程序只是一個工業控制器,或者由於惡意更新而導致故障將導致區域性災難的系統,它確實會有所不同。