Aes

我需要幫助確定基於 .NET 中的 System.Security.Cryptography 的最佳加密選項

  • August 12, 2021

在 Code Review Stack Exchange 上提出了一個問題,收到了很好的總結,但被重定向到了這裡。涵蓋文章的答案,有人指出並建議:

  1. 使用普通 (CBC) 模式。他們建議使用 GCM,但在我的解決方案中,我需要避免添加額外的庫。這是我的選項,主要用於CBC、CTR 和 ECB 中的 AES

哪個更好用?這是一個太寬泛的問題嗎?各有什麼好處?例如,如果是信用卡數據,哪個更合適? 2. PBKDF2 的使用已經過時,建議使用 Argon2,但這是我正在使用的。我不知道用什麼來代替它,以便保持在.NET 開箱即用的約束範圍內。

因此,以信用卡為例,請幫助我回答這些問題,但不要引入另一個庫(即 BouncyCastle),或者如果絕對有必要包含另一個庫,請說明為什麼 .NET 的預設加密不適合。

不引入另一個庫

嗯,這不是一個理想的情況,但仍有希望。在瀏覽了可用工具列表之後,仍然可以做一些事情,但當然,與依賴外部庫相比,該解決方案的健壯性和現代性會降低。

哪個更好用?

這仍然取決於。如果您在任何情況下都絕對不能容忍密文擴展, 並且如果您在任何情況下都*絕對不能容忍使用外部庫,*那麼可以,CBC 模式是您的最佳選擇。如果您不能容忍密文擴展,您想考慮使用 EME 或XTS模式作為備份,但在本節的其餘部分,我將假設密文擴展是可以接受的。

***如果您在任何情況下都絕對不能容忍使用外部庫,*那麼您最好的選擇是使用 AES-CTR + HMAC-SHA256。**您已經找到了 CTR 模式的列舉,這將問題引向 HMAC-SHA256。這裡的最佳方法是獲取整個密文和所有相關數據(例如路由資訊和/或鹽),通過 HMAC 執行它並附加(或以其他方式配對)生成的身份驗證標籤。然後在解密時拒絕任何缺少標籤或具有無效標籤的傳入消息。密鑰應按如下所述派生,但絕對應獨立於 AES 密鑰和 CTR IV。

PBKDF2 的使用已過時,建議使用 Argon,但這是我正在使用的。不確定在 .NET 開箱即用的限制內用什麼替換它

那就是問題所在。空無一物。這是唯一可以接受回退到 PBKDF2 的情況。有兩件事仍然可以從 PBKDF2 中獲得良好的安全性,並且您真的想要同時做到這兩個:

  1. **使用非固定迭代計數。**關於 PBKDF2 的一個非常好的事情是它的執行時間在其迭代計數中是完全線性的,因此理想情況下,您希望動態測量每秒可以在目標系統上執行多少次迭代,然後線性推斷您實際想要執行的次數。通常,您希望將 100 毫秒的目標設置在伺服器之類的東西上,但是您可以騰出的 CPU 時間越多越好。
  2. **聚合-衍生-擴展。**正如 CodeReview.SE 答案中的“旁注”所指出的那樣,目前的 PBKDF2 參數引導三個獨立的推導“鏈”,這些推導很容易被攻擊者並行化。理想情況下(這在此處是可能的),使案例如直接 SHA256 散列將密鑰材料集中到單個字元串(“聚合”)中(對於更複雜的密鑰材料結構和屬性,這可能會變得更加複雜),然後通過昂貴的密鑰派生函式,所以這個函式只被呼叫一次因此可以盡可能昂貴(“派生”)。最後,人們得到了 TLS 所謂的“主機密”。從中派生出所需的實際秘密,例如 AES 密鑰、HMAC 密鑰以及可能的 CTR IV(“擴展”)。理想情況下,可以使用 HKDF 執行此操作,但在這種情況下,單次迭代的 PBKDF2 也可以像“標籤驅動擴展”一樣將主密鑰放入 HMAC 實例的密鑰輸入和標籤密鑰(例如字元串“AES 密鑰”)進入消息輸入。

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