Hmac

可以將一次性密碼用作 HMAC 中的 nonce 以防止重放嗎?

  • October 6, 2017

注意:在下面的文章中 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 或具有允許偏差時間的時間戳)

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