1:甚么是nonce
維基百科:安全工程中,Nonce是1個在加密通訊只能使用1次的數字。在認證協議中,它常常是1個隨機或偽隨機數,以免重放攻擊。
2:舉例說明
1個典型的基于 nonce 的驗證協議以下:
這里的 cnonce 為 client nonce(后面將討論為何需要 cnonce)。Client 其實不直接發送密碼(或密碼直接加密后的密文)用以免攻擊者直接盜取密碼(或密碼直接加密后的密文)并冒充用戶進行身份驗證。
先不斟酌 Client nonce。Server 首先發送 nonce 到 Client,Client 將密碼和 nonce 通過 hash 運算再提交到 Server 進行身份驗證,這樣我們可以認為(而非絕對)每次用于身份驗證的 hash 值都不相同,即便攻擊者盜取了前1次用于身份驗證的 hash 值也沒法冒充用戶進行登錄。公式以下:
A = Hash(nonce, password)
在不安全的網絡環境中,A、nonce、Hash 算法都可以被攻擊者獲得,如果能夠滿足以下條件:
攻擊者則在理論上沒法實行 Replay attack。 因此 nonce 在特定上下文中僅僅被使用1次和 Hash 算法盡可能避免沖突是安全的關鍵。為了確保 nonce 在特定上下文中僅僅被使用1次,可使用以下策略生成 nonce:
以上算法難以免攻擊者使用字典進行密碼破解。其中1個可行的方法為:攻擊者可以截取 A = Hash(nonce, password) 中的 A、nonce,然后通過字典破解用戶的密碼 password。不過破解的進程是很耗時的,使用1個中等范圍的集群(medium-scale cluster)可能需要數周),如果期望破解不計其數用戶的密碼,那末將消耗極大量的時間。
如果攻擊者能夠構建1個預計算的表(例如 Rainbow tables)那末破解大量用戶密碼的時間將大大縮短。nonce 禁止了預計算表的生成(由于 Server nonce 每次都不相同),但是如果網絡中傳輸的數據能被篡改,情況就不1樣了。假定攻擊者捏造1個固定的 nonce 發送給網絡中的 Clients 并且記錄 nonce 和 Clients 的回應(Hash(nonce, password)),由于 nonce 為1個固定值,那末攻擊者就能夠構造1個預計算的表,此表使用此固定的 nonce。通過此表便可大大縮短破解用戶密碼的時間了。
為了不攻擊者通過以上手段構建預計算的表。在 Client 也引入了1個 nonce。這樣,每次都不同的 cnonce 避免了預計算表的生成。
下一篇 JQuery小練習