數據庫和端到端加密
我目前正在設計一個移動/桌面應用程序來同步一些消息或筆記。我正在尋找一種方法來保護它並避免讓伺服器能夠讀取消息。
我的目標是讓客戶端在客戶端加密消息,將其發送到將其儲存到數據庫的伺服器。然後,如果同一帳戶上的另一個客戶端連接,它將接收加密消息,將其解密並將其儲存在其本地記憶體中。
我不能只使用一種標準的端到端加密方法,因為我不希望每次使用應用程序時都有不同的密鑰。我希望能夠將消息儲存在數據庫中。
另一個限制是我不希望使用者手動管理密鑰。我只想要帳戶的密碼。
所以,我想像的一個解決方案是使用像 RSA 這樣的非對稱算法和像 Blowfish 或 CAST 這樣的對稱算法。我在使用者創建帳戶時生成一個 RSA 密鑰對,使用 CAST 和使用者密碼作為密鑰對其進行加密,並將結果本地儲存在手機上。然後,使用公共 RSA 密鑰對消息進行加密,發送到伺服器並儲存在數據庫中。為了能夠在另一個客戶端(例如在 PC 上)解密消息,我只需將加密的密鑰對從手機發送到伺服器,然後再將其發送回新客戶端。新客戶端現在可以使用使用者密碼解密 RSA 密鑰對並解密儲存在數據庫中的消息。
由於我對所有這些東西都很陌生,我不知道這是否是一個好主意,或者是否有更好的方法來做到這一點。
您似乎在發明自己的 ad-hoc 協議,沒有經過身份驗證的加密,並使用具有已知安全漏洞(例如小塊大小)的舊算法。
我強烈建議您使用高級現代庫,例如libsodium,並使用其crypto_box函式進行身份驗證加密,以及使用 Argon 進行密碼密鑰派生以保護私鑰。這將提供快速的現代認證加密(您提出的解決方案不會提供)。大多數流行的高級程式語言都有 libsodium“包裝器”。
使用已知良好的高級工具箱(例如 libsodium)更難出錯。如果不使用更多預先建構的東西,您將不得不決定許多容易出錯的安全關鍵細節,例如:對稱模式、密文的身份驗證機制、填充、密鑰生成、隨機數生成和重用保護、密鑰包裝、填充、側通道電阻和編碼。
您仍然需要使用 libsodium 之類的東西為您的應用程序編寫一些高級建構塊,但這不會那麼困難或容易出錯。