Algorithm-Design
何時、何地以及如何使用 HMAC
這個問題可能看起來像其他一些問題的重複,即這個問題,但即使該問題詢問何時以及如何使用 HMAC,答案僅涉及 HMAC 是什麼以及它為什麼/如何工作。
所以,我的問題是:
- 什麼時候適合使用 HMAC?如果我在本地電腦上加密文件?如果我正在加密文件並將其同步到伺服器?如果我要向 Bob 發送消息?什麼時候不需要?
- 簡單地說,生成 HMAC 的推薦算法是什麼?我看過 Wikipedia 頁面,它對填充做了一些奇怪的事情,並在“實用密碼學”中閱讀了有關 HMAC 的內容,其中說 a 和 b 是“指定的常量”,而沒有詳細介紹這些常量的約束。
- 該書之前使用 h(h(m)||m) 來防止長度擴展攻擊,後來為 HMAC 定義了不同的算法。為什麼前者不適合 HMAC?
什麼時候適合使用 HMAC?如果我在本地電腦上加密文件?如果我正在加密文件並將其同步到伺服器?如果我要向 Bob 發送消息?什麼時候不需要?
我認為這裡最好的答案是您正在混合抽象級別。由於您一直在閱讀 Ferguson等人的書,因此我建議您參考他們關於安全通道概念的材料— 一種 API 提供了更適合您在此處描述的場景的概念(即使他們展示的可能並不適合所有人)。事實上,在他們的書中,HMAC 被應用於如何實現安全通道的上下文中,這樣需要安全通信的客戶端就不必考慮 HMAC(或隨機數重用或類似的東西)。
第二點是,過去 20 年的兩個重大的、來之不易的教訓是:
- 認證加密的重要性;
- 弄錯是多麼容易!
因此,您的問題的另一個答案是,預設情況下,您應該在任何地方使用身份驗證,除非您可以證明您不需要。這並不意味著專門使用 HMAC(同樣,您正在混合抽象級別!),但這確實意味著幾乎所有加密都應該是經過身份驗證的加密,而且它不應該是臨時的——它應該是一個很好的-從經過良好審核的庫函式中研究構造。
一些很好的閱讀: