RSA 消息完整性
我希望發送一些僅 RSA 可以加密的小數據,並且我還發送了一個共享密鑰。
A --> B ; RSA(data||shared_secret) // B will verify the shared_secred and authenticate A;
對比
A --> B ; RSA(data||shared_secret) || SHA-256(data||shared_secret)
RSA 是 RSA-OEAP,而不是自產的東西。
驗證共享秘密是否足以保證消息的完整性和真實性?或者,我還應該發送消息的雜湊嗎?我想問一下,因為如果我不需要雜湊,發送兩倍的數據似乎是多餘的。
如果是我們被告知
shared_secret
的純文字密碼,那麼發送的第二種方法 是不安全的。
RSA-OAEP(data||shared_secret) || SHA-256(data||shared_secret)
這是因為猜測
data
允許通過與已知的SHA-256(data||shared_secret)
. 這是密碼破解的理想選擇。如果我們更改SHA-256(data)
為HMAC-SHA-256(shared_secret, data)
,這也適用,這是一種從帶有安全證明/參數的雜湊構造 MAC 的方法。出於同樣的原因,這種結構也會損害
data
.仍有待確定 A 發送
RSA-OAEP(data||shared_secret)
給 B(使用 B 的公鑰計算),並讓 B 解密(使用 B 的私鑰)並驗證
shared_secret
是否足以確保data
; 當然,假設沒有對手可以學到shared_secret
。我的回答是:**不,**至少對於某些可能的建立或使用
shared_secret
. 尤其是:
- 如果
shared_secret
知道它的任何一方事先使用了它,這涉及發送
RSA-OAEP(something||shared_secret)
每個 B 的公鑰,那麼 pof 會達到所需的完整性和真實性
data
,因為對手可以重用該密碼來濫用 B 以相信它data
是不相關something
的。
- 這包括 if
shared_secret
僅用於涉及不同值的協議的多次迭代data
。- 獨立地,很有可能 B 對該消息所做的檢查可以用作測試的預言機
shared_secret
;如果這是一個密碼(我們被告知),這很糟糕(儘管沒有其他協議那麼糟糕,因為這是一種線上攻擊)。那麼,在shared_secret
洩露之後,天空才是極限。另一方面,如果
shared_secret
是由經過身份驗證的各方選擇的秘密的 XOR 建立的固定長度的廣泛秘密,並且RSA-OAEP(data||shared_secret)
是唯一一次shared_secret
使用而不是作為對稱算法的密鑰,那麼我認為沒有理由不使用目標得到滿足。這不是保險。