Asp.net

AES加密和密鑰儲存?

  • April 14, 2016

幾年前,當我第一次接觸到 ASP.net 和 .NET Framework 時,我建構了一個非常簡單的線上文件儲存系統。該系統使用 Rijndael 加密將加密的文件儲存在伺服器的硬碟上,並使用 HttpHandler 解密這些文件並將其發送到客戶端。

作為我第一個使用 ASP.net 和數據庫的項目之一,對整個事情的工作原理不太了解(以及落入Jeff Atwood 在這個主題上描述的同一個陷阱),我決定將新生成的密鑰和 IV 儲存在一起與數據庫中的每個文件條目。

為了讓事情更清楚一點,加密只是為了保護文件不被直接訪問伺服器,並且密鑰不是由使用者輸入的密碼生成的。

我的問題是,假設我不想為所有文件保留一個密鑰,我應該如何儲存加密密鑰以獲得最佳安全性?什麼被認為是最佳實踐?(即:在不同的伺服器上,在純文字文件上,加密)。

另外,這種加密算法中使用的初始化向量是什麼?它應該在系統中保持不變嗎?

密鑰應該受到保護並保密,就這麼簡單。實施不是。值得信賴的供應商以高價出售密鑰管理系統,因為解決問題很困難

您當然不想為每個使用者使用相同的密鑰,使用的密鑰越多“越容易”破解它,或者至少有一些資訊洩漏。AES 是一種分組密碼,它將數據拆分為多個塊,並將最後一個塊加密的結果提供給下一個塊。初始化向量是算法的初始輸入,因為在起點沒有什麼可以開始的。使用具有相同密鑰的隨機 IV 可以降低資訊洩露的風險——加密的每條數據都應該不同。

儲存密鑰的方式取決於系統的架構方式。我剛剛完成了一個 KMS,其中密鑰遠離主系統,加密和解密功能通過 WCF 公開。您以純文字形式發送並獲得對密鑰的引用和加密文本 - 這樣 KMS 負責系統中的所有加密。在您的情況下,這可能是矯枉過正。如果使用者在您的系統中輸入密碼,那麼您可以使用它來生成密鑰對。然後,該密鑰對可用於加密該使用者的密鑰儲存 - XML、SQL 等,並用於解密用於保護數據的每個密鑰。

如果不了解您的系統是如何配置的,或者它的目的,除了“必須保護密鑰,不得重複使用密鑰和 IV”之外,很難推薦任何其他內容。

引用自:https://stackoverflow.com/questions/2037021