維基百科: 安全工程 中,Nonce是壹個在加密通信只能使用壹次的數字。在認證協議中,它往往是壹個 隨機 或 偽隨機 數,以避免 重放攻擊 。
二:舉例說明
壹個典型的基於 nonce 的驗證協議如下:
這裏的 cnonce 為 client nonce(後面將討論為什麽需要 cnonce)。Client 並不直接發送密碼(或者密碼直接加密後的密文)用以避免攻擊者直接竊取密碼(或者密碼直接加密後的密文)並冒充用戶進行身份驗證。
先不考慮 Client nonce。Server 首先發送 nonce 到 Client,Client 將密碼和 nonce 通過 hash 運算再提交到 Server 進行身份驗證,這樣我們可以認為(而非絕對)每次用於身份驗證的 hash 值都不相同,即使攻擊者竊取了前壹次用於身份驗證的 hash 值也無法冒充用戶進行登錄。公式如下:
A = Hash(nonce, password)
在不安全的網絡環境中,A、nonce、Hash 算法都可以被攻擊者獲取,如果能夠滿足以下條件:
nonce 僅僅被使用壹次
Hash 運算不出現沖突
攻擊者則在理論上無法實施 Replay attack。 因此 nonce 在特定上下文中僅僅被使用壹次以及 Hash 算法盡量避免沖突是安全的關鍵。為了確保 nonce 在特定上下文中僅僅被使用壹次,可以使用以下策略生成 nonce:
nonce 可以是壹個時間相關變量
nonce 可以是壹個通過足夠隨機算法生成的足夠長的 bits
以上算法難以避免攻擊者使用字典進行密碼破解。其中壹個可行的方法為:攻擊者可以截取?A = Hash(nonce, password) 中的 A、nonce,然後通過字典破解用戶的密碼 password。不過破解的過程是很耗時的,使用壹個中等規模的集群(medium-scale cluster)可能需要數周),如果期望破解成千上萬用戶的密碼,那麽將消耗極大量的時間。
如果攻擊者能夠構建壹個預計算的表(例如 Rainbow tables )那麽破解大量用戶密碼的時間將大大縮短。nonce 阻止了預計算表的生成(因為 Server nonce 每次都不相同),但是如果網絡中傳輸的數據能被篡改,情況就不壹樣了。假定攻擊者偽造壹個固定的 nonce 發送給網絡中的 Clients 並且記錄 nonce 和 Clients 的回應(Hash(nonce, password)),由於 nonce 為壹個固定值,那麽攻擊者就可以構造壹個預計算的表,此表使用此固定的 nonce。通過此表即可大大縮短破解用戶密碼的時間了。
為了避免攻擊者通過以上手段構建預計算的表。在 Client 也引入了壹個 nonce。這樣,每次都不同的 cnonce 防止了預計算表的生成。