簡述
Nonce,Number used once或Number once的縮寫,在密碼學中Nonce是一個只被使用一次的任意或非重複的隨機數值,在加密技術中的初始向量和加密散列函式都發揮著重要作用,在各類驗證協定的通信套用中確保驗證信息不被重複使用以對抗重放攻擊(Replay Attack)。在信息安全中, Nonce是一個在加密通信只能使用一次的數字。在認證協定中,它往往是一個隨機或偽隨機數,以避免重放攻擊。Nonce也用於流密碼以確保全全。如果需要使用相同的密鑰加密一個以上的訊息,就需要Nonce來確保不同的訊息與該密鑰加密的密鑰流不同。
具體套用
在摘要認證中伺服器讓客戶選一個隨機數(稱作”nonce“),然後瀏覽器使用一個單向的加密函式生成一個訊息摘要(message digest),該摘要是關於用戶名、密碼、給定的nonce值、HTTP方法,以及所請求的URL。
例子
一個典型的基於 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 防止了預計算表的生成。