一:什么是nonce
維基百科:安全工程中秘蛇,Nonce是一個在加密通信只能使用一次的數(shù)字传于。在認證協(xié)議中讹躯,它往往是一個隨機或偽隨機數(shù)菩彬,以避免重放攻擊。
二:舉例說明
一個典型的基于 nonce 的驗證協(xié)議如下:
這里的 cnonce 為 client nonce(后面將討論為什么需要 cnonce)潮梯。Client 并不直接發(fā)送密碼(或者密碼直接加密后的密文)用以避免攻擊者直接竊取密碼(或者密碼直接加密后的密文)并冒充用戶進行身份驗證骗灶。
先不考慮 Client nonce。Server 首先發(fā)送 nonce 到 Client秉馏,Client 將密碼和 nonce 通過 hash 運算再提交到 Server 進行身份驗證耙旦,這樣我們可以認為(而非絕對)每次用于身份驗證的 hash 值都不相同,即使攻擊者竊取了前一次用于身份驗證的 hash 值也無法冒充用戶進行登錄萝究。公式如下:
A = Hash(nonce, password)
在不安全的網(wǎng)絡環(huán)境中免都,A、nonce帆竹、Hash 算法都可以被攻擊者獲取绕娘,如果能夠滿足以下條件:
nonce 僅僅被使用一次
Hash 運算不出現(xiàn)沖突
攻擊者則在理論上無法實施 Replay attack。 因此 nonce 在特定上下文中僅僅被使用一次以及 Hash 算法盡量避免沖突是安全的關鍵栽连。為了確保 nonce 在特定上下文中僅僅被使用一次险领,可以使用以下策略生成 nonce:
nonce 可以是一個時間相關變量
nonce 可以是一個通過足夠隨機算法生成的足夠長的 bits
以上算法難以避免攻擊者使用字典進行密碼破解侨舆。其中一個可行的方法為:攻擊者可以截取?A = Hash(nonce, password) 中的 A、nonce绢陌,然后通過字典破解用戶的密碼 password挨下。不過破解的過程是很耗時的,使用一個中等規(guī)模的集群(medium-scale cluster)可能需要數(shù)周)下面,如果期望破解成千上萬用戶的密碼复颈,那么將消耗極大量的時間。
如果攻擊者能夠構建一個預計算的表(例如Rainbow tables)那么破解大量用戶密碼的時間將大大縮短沥割。nonce 阻止了預計算表的生成(因為 Server nonce 每次都不相同)耗啦,但是如果網(wǎng)絡中傳輸?shù)臄?shù)據(jù)能被篡改,情況就不一樣了机杜。假定攻擊者偽造一個固定的 nonce 發(fā)送給網(wǎng)絡中的 Clients 并且記錄 nonce 和 Clients 的回應(Hash(nonce, password))帜讲,由于 nonce 為一個固定值,那么攻擊者就可以構造一個預計算的表椒拗,此表使用此固定的 nonce似将。通過此表即可大大縮短破解用戶密碼的時間了。
為了避免攻擊者通過以上手段構建預計算的表蚀苛。在 Client 也引入了一個 nonce在验。這樣,每次都不同的 cnonce 防止了預計算表的生成堵未。