可以/應該使用什麼算法來加密文件以儲存在不受信任的伺服器上?
我需要一種可以在大文件上快速執行且不會增加文件大小的加密算法。它應該使用密鑰來加密/解密數據。這些文件將使用 REST 和通過 HTTPS 發送,但必須使用帶有密鑰的良好加密/解密方法(用於網站)。
文件將保存在第三方伺服器上,雖然文件是通過 HTTPS 發送的,但它們必須加密儲存在遠端伺服器上,並在檢索時解密。不會分發密鑰。密鑰將儲存在我信任的伺服器上,因為它也是接收者!我想加密文件,把它放在第 3 方伺服器上,然後當我需要它時,我可以檢索它並解密它。
這個問題仍然缺乏細節,所以這個答案同樣含糊不清。
任何現代密碼都大大超過消費者磁碟/網路 IO 速度,您可以將任何現代分組密碼(AES 可能是這裡的最佳選擇)與流式操作模式配對,以便文件大小保持不變,例如 CTR 或循環流化床。但是,您仍然需要最重要的完整性,因此您還需要一個快速且強大的雜湊函式來用作 HMAC(或在支持身份驗證的模式下使用 AES,但這種模式還不是很普遍)。一個好的散列函式是 SHA256(相當快)。
沒有“最佳”算法,只有滿足您需求的算法和不滿足您需求的算法。您的需求是安全性和速度 - 相應地選擇。我在上面給出了一些相當籠統的建議。
當然,更好的選擇仍然是使用已經可以生產的東西,比如 OpenSSL。這樣您就不需要自己實現它,只需要學習 API 並在網路套接字的任一端進行一些函式呼叫,並且您不必擔心安全問題(或者至少,不像很多)。
同樣,如果您不知道自己在做什麼,則不應實施密碼學,因此您的評論(例如“我希望我能自己知道”)至少可以說令人擔憂……
看來您的主要要求是文件大小不增加。這是可能的,但會犧牲一些安全性(即完整性和身份驗證),因此您似乎只能提供機密性。如果文件大小可以稍微增加(比如不超過 300 位),您應該使用 GCM 等身份驗證模式進行加密。
正如 Thomas 所指出的,流模式不會改變文件大小,因此請使用其中一種。如果你走這條路,你必須意識到一些事情。流媒體模式具有延展性。這意味著攻擊者(即儲存數據的第 3 方伺服器)可以對密文進行更改,從而在解密時對明文進行可預測的更改。
在 CFB 中,如果攻擊者翻轉密文的一位,它就會翻轉明文的相應位,加上下一個塊將被完全加擾。在OFB中,如果你翻轉一個密文位,在解密時,對應的明文位將被翻轉。與CTR相同,更改一位密文,您將翻轉相應的明文位。
這可能會產生災難性的後果。例如,如果攻擊者知道該文件是格式為 的文本文件
Transfer 500.00 dollars to mikeazo
,則攻擊者(在本例中為我)可以將其更改為Transfer 50,000 dollars to mikeazo
.要記住的另一件事是流模式所需的 IV 或 Nonce。這些有自己的要求,必須以某種方式儲存或傳達。它們也可能被潛在地篡改,這會導致問題(例如,可能只有一個密文塊無法恢復,或者可能整個密文都無法恢復)。
最後一個要考慮的方面是鍵控。密鑰將如何分配?
我的觀點是,是的,您可以使用帶有 AES 的流模式來加密文件而不增加文件大小。但是,您(或任何強制執行此操作的人)沒有考慮到過多的意外後果。如果將其用於企業的生產系統,您將自己置於巨大的風險之中,如果是這種情況,請聘請專業人士。從長遠來看,它將為您節省金錢。如果這不是一個選項,請使用完善的標準/軟體。如果許可適用於應用程序,我會推薦GPG之類的東西。