Public-Key

數據庫和端到端加密

  • November 17, 2019

我目前正在設計一個移動/桌面應用程序來同步一些消息或筆記。我正在尋找一種方法來保護它並避免讓伺服器能夠讀取消息。

我的目標是讓客戶端在​​客戶端加密消息,將其發送到將其儲存到數據庫的伺服器。然後,如果同一帳戶上的另一個客戶端連接,它將接收加密消息,將其解密並將其儲存在其本地記憶體中。

我不能只使用一種標準的端到端加密方法,因為我不希望每次使用應用程序時都有不同的密鑰。我希望能夠將消息儲存在數據庫中。

另一個限制是我不希望使用者手動管理密鑰。我只想要帳戶的密碼。

所以,我想像的一個解決方案是使用像 RSA 這樣的非對稱算法和像 Blowfish 或 CAST 這樣的對稱算法。我在使用者創建帳戶時生成一個 RSA 密鑰對,使用 CAST 和使用者密碼作為密鑰對其進行加密,並將結果本地儲存在手機上。然後,使用公共 RSA 密鑰對消息進行加密,發送到伺服器並儲存在數據庫中。為了能夠在另一個客戶端(例如在 PC 上)解密消息,我只需將加密的密鑰對從手機發送到伺服器,然後再將其發送回新客戶端。新客戶端現在可以使用使用者密碼解密 RSA 密鑰對並解密儲存在數據庫中的消息。

由於我對所有這些東西都很陌生,我不知道這是否是一個好主意,或者是否有更好的方法來做到這一點。

您似乎在發明自己的 ad-hoc 協議,沒有經過身份驗證的加密,並使用具有已知安全漏洞(例如小塊大小)的舊算法。

我強烈建議您使用高級現代庫,例如libsodium,並使用其crypto_box函式進行身份驗證加密,以及使用 Argon 進行密碼密鑰派生以保護私鑰。這將提供快速的現代認證加密(您提出的解決方案不會提供)。大多數流行的高級程式語言都有 libsodium“包裝器”。

使用已知良好的高級工具箱(例如 libsodium)更難出錯。如果不使用更多預先建構的東西,您將不得不決定許多容易出錯的安全關鍵細節,例如:對稱模式、密文的身份驗證機制、填充、密鑰生成、隨機數生成和重用保護、密鑰包裝、填充、側通道電阻和編碼。

您仍然需要使用 libsodium 之類的東西為您的應用程序編寫一些高級建構塊,但這不會那麼困難或容易出錯。

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