可以將一次性密碼用作 HMAC 中的 nonce 以防止重放嗎?
注意:在下面的文章中 OTP = one-time-password
我正在做一個項目,我需要在兩個端點之間發送單向消息。通過兩個端點之間的側通道已經存在共享秘密。任何一個端點都沒有使用者參與。由於一些限制,我無法控制在實際發送消息時是否使用加密,所以我必須假設消息是純文字的。讀者可以將消息假定為某種“動作”。
攜帶消息的數據包還包含使用共享密鑰計算的消息的 HMAC。我需要防止重放攻擊。從wikipedia,我看到選項是:OTP、nonce 和時間戳。
我只能假設兩個端點之間的時鐘大致同步(兩個端點都有一些可靠的時間源)。我正在考慮在計算 HMAC 時添加某種隨機數。我想問一下我在下面選擇的選項對於 nonce 是否正確。我想使用一些標準技術。我確實理解 nonce 不能重複。
我的第一個問題是某些 OTP 值是否可以被視為 nonce(維基百科類別使它們看起來不同)。
我發現TOTP算法可以使用共享密鑰和時間戳計算一次性密碼。我想問一下TOTP是否可以用作nonce。
TC = floor((unixtime(now) − unixtime(T0)) / TS), TOTP = HOTP(SecretKey, TC), TOTP-Value = TOTP mod 10d, where d is the desired number of digits of the one-time password.
TC 將儲存在一個無符號的 64 位變數中。由於 HOTP 是一個雜湊函式(假設 SHA-256),因此 TOTP 不會重複(直到無符號 64 位 TC 達到其最大值並迴繞)。我的第二個問題是 TOTP 在計算 HMAC 時是否可以用作隨機數?
(注:我認為,一般情況下 OTP 通常被理解為One-Time Pad。這裡的意思是One-Time Password。)
一般來說,使用 OTP 作為 nonce 似乎是不可能的。OTP 不一定總是必須是不同的。由於通信方之間存在某種同步,OTP 可能會重複。
具體來說,假設您的 OTP 由隨機的 64 位組成。然後,每當您需要密碼時,如果雙方都獨立於先前的值導出 64 個隨機位,那就沒問題了。
如果你需要一個隨機數,但是這會在大約十億次重複後給你一個不錯的碰撞機率。(由於生日限制。)
然而,實際上,大多數散列函式都具有良好的PRF屬性,可用於生成隨機數。
我假設您的意思是使用基於時間的 OTP。最後 - 客戶端和伺服器需要有另一個(?)公共共享密鑰來計算 OTP,伺服器需要根據時間驗證 OTP。
我的第一個問題是某些 OTP 值是否可以被視為 nonce
嗯 - 不是真的。TOTP 不保證是唯一的,並且保證在時間段內是相同的。
我的第二個問題是在計算 HMAC 時是否可以使用 TOTP 作為 nonce
如前所述 - 在時間段內將是相同的
建議:
- 您可以隨數據發送時間戳(並在 HMAC 中包含時間戳)
- 重放攻擊的預防頻率如何 - 您需要在有效期內使用某種計數器或記憶體/驗證 nonces(消息 id)(無論它是 TOTP 或具有允許偏差時間的時間戳)