研究人員提出創新方案,可以算出你的密碼是否容易被黑客攻破
登入微信需要密碼,開啟郵箱需要密碼,手機支付需要密碼⋯,現代人生活離不開密碼,但你的密碼安全嗎?你知道使用你知道使用和很多人一樣的密碼,不僅僅損害使用者個人的安全性,甚至還會被用於攻擊其他使用者嗎?
即便一般網站會設計規則禁止使用者設定諸如 123456 或 qwerty 之類非常容易識別的弱密碼,但是對於更“時尚”的弱密碼就無能為力了。比如隨著《神奇女俠》的熱映,流行的密碼可能也隨之從 superman 變成 wonderwoman。
一群以色列研究人員 ,近日在一場密碼學大咖雲集的研討會 RWC 2019 上,提出一種創新方案,使用一種增強了抗干擾能力的多方計算協議,可以在不損害使用者密碼隱私性的前提下,系統地發現並統計出現的頻率很高的弱密碼,且統計結果不會被攻擊者輕易操縱和篡改。這種方案可用於幫助使用者更好地選擇自己的密碼,降低受到攻擊的風險。
如何統計哪些密碼最常用?
在這篇論文 How to (not) Share a Password: Privacy preserving protocols for finding heavy hitters with adversarial behavior 中,Mini Naor、Benny Pinkas、Eyal Ronen 等人指出,自從1961年麻省理工學院( MIT )在 CTSS 共享作業系統中使用密碼以來,現代意義上的密碼已經有了半個多世紀的歷史。如今隨著移動網際網路和物聯網的蓬勃發展,密碼已經滲透到了我們生活中的各個角落。但是很多現實中的例子反覆向我們證明:密碼並不意味著絕對安全,即使密碼是由使用者自己選取的。
一方面,密碼保證安全的一個前提條件是密碼本身必須是隨機選取的,即密碼含有比較高的資訊熵。但是這樣的強密碼在提供很好的安全性也為記憶帶來了很大負擔,特別是在現代人需要記住很多個不同賬戶的密碼的情況下。
於是對於那些隔幾個月才登入一次的賬號,常常會出現登入前必須先重置已經忘記的密碼的情況。為了方便起見,很多人實際上會選擇比較容易記憶、同時資訊熵也較低的密碼。
另一方面,由生日或者連續數字/字母構成的弱密碼往往非常容易被猜到,並不能起到應有的保護作用。而且流行的弱密碼不僅僅損害使用者個人的安全性,甚至還會被用於攻擊其他使用者。
比如某個網站洩露出明文儲存的使用者密碼以後,黑客就可以選擇裡面出現頻率比較高的密碼組成字典,用於攻擊其他網站的使用者。因為不同網站使用者選擇密碼的分佈一般是大致相似的,於是一個網站的使用者中流行的密碼被另一個網站使用者使用的概率也是顯著高於隨機選取的密碼的,黑客便可藉此極大地提高攻擊的效率。
為了避免弱密碼帶來的安全性隱患,很多系統會選擇禁止使用弱密碼,為此需要維護一個常用弱密碼的黑名單。這個黑名單包括一些常見的模式和通過以往的密碼洩露事件已知的流行密碼。
那麼問題來了——流行密碼往往是隨著時代不斷變化的,應該如何去系統地統計併發現哪些密碼是出現頻率很高的弱密碼呢?直接統計密碼明文顯然不是一個好主意,在安全性上有很大的漏洞;即使是統計密碼的(未加鹽的)雜湊值的頻率也會帶來很多安全上的隱患。Eyal Ronen 所做的報告中就提出了一個解決上述問題的方案。
一位資訊洩漏與 The Password Game
要統計常見密碼必須滿足的第一條要求,就是不要對使用者造成傷害,或者儘可能減少對使用者的傷害。
從攻擊者的角度來看,一個公開的常用密碼黑名單,實際上就是一個攻擊者夢寐以求的字典,可以用來幫助其猜測使用者的密碼。此外公開的密碼黑名單也可能成為系統被攻擊的漏洞。
另一方面,從使用者的角度來說,雖然統計使用者的密碼必然要求記錄有關使用者密碼的資訊,但是如果只洩漏密碼中的一位的話,其實對於安全性的影響是微乎其微的——因為攻擊者只需要多花一點時間就可以猜到這一位資訊。
我們可以通過如下猜測密碼的博弈遊戲來說明:攻擊者 A 希望攻擊一個裝置 D,為此 A 需要選定一個長度為 L 的猜測密碼列表,若 D 的密碼在列表 L 裡,則 A 獲得勝利。
在這個博弈中,如果 A 在有一位資訊洩漏的情況下可以用一個長度為 L 的列表以概率 delta 獲勝,則另一個攻擊者 A’ 只需要選擇一個長度為 2L 的列表即可在沒有洩漏的條件下實現以相同的概率 delta 獲勝。更進一步,如果使用了具有差分隱私保護的演算法,則 A’ 不需將列表長度加倍也可以保持相似的勝率(對於實現了 eps-DP 的差分隱私方案,A’ 使用長度為 L 的列表即可達到不小於 的成功率)。
在計算理論中,尋找常見密碼實際上就是解決一個尋找重元素(heavy hitter)的問題,即從一列輸入元素中發現出現頻率大於一定比例的元素。在這個過程中,我們希望每個使用者的密碼洩漏的資訊不能超過一個位元,以保證使用者的隱私性和安全性。另外我們還希望 false negative 的概率是可忽略的,即幾乎不可能不錯過任何一個弱密碼;對於 false positive 可以適當放鬆,但是也希望其概率儘可能小,以減少正常的密碼被錯誤拒絕的概率。

類似的問題之前已經被研究過,不過通常需要一個一定程度上可信的第三方,或者是若干個沒有串通的第三方。但是在現實中這些假設都過於理想化了。現實中除了缺乏一個可信的第三方去進行統計以外,還可能出現攻擊者試圖阻止統計者找到一個弱密碼黑名單的情況。為此我們也需要考慮如何避免統計結果被操縱或篡改。
使用傳統的多方計算技術可以部分地解決上述問題,即實現對於使用者的隱私的保護,但是抵抗惡意干擾的能力比較弱。所以 Eyal Ronen 等人在這個報告裡講到的方案,實際上使用了一種增強了抗干擾能力的兩方計算協議。該協議實現的正確性如下:

一個半誠實方案
這個方案源自於 【BNSTS17】 這篇論文的工作。實現的方式是選擇一個輸出長度為 l 位元的雜湊函式,可以把任意長度的密碼給對映到長度為 l 的二進位制串上,且出現碰撞的概率較低。

然後向每個使用者傳送一個隨機數 r,要求使用者返回 r 和 H(password)的內積 v(如下圖所示)。收到 v 以後,統計者(伺服器)再對所有可能的 x 依次更新 T[x] 的值(T是一個長度為 2^l 的向量)。

通過簡單的計算可以驗證,如果 x 作為密碼的雜湊值出現的頻率高,則相應的 T[x] 的值也會很大。因為 T[x] 本質上是所有的 x 加上一個隨機的噪音。因此只需統計出現頻率超過一定閾值的 T[x] 即可得到一個關於常見密碼的雜湊值的列表。如下圖所示。

但是這種方案需要使用者一側比較誠實地配合才行。否則如果使用者刻意選擇相反的結果,則可以減少相應的密碼被統計到的次數,即變相地實現了隱藏一個常見密碼的目的。

一個基於平方剩餘的方案

對於兩個大素數的乘積 N=pq,很難判斷 Jacobi Symbol 為 1 的那些數是否是關於 N 的平方剩餘。利用這個性質,我們可以對於每個 v 計算如下的 e,並以此為依據更新 T[v]。 此後的步驟與上一個方案相似。
需要指出的是,上述方案在攻擊者知道一個非平方剩餘的時候並不安全。但是好在攻擊者很難以比隨機猜測更好的方法找到一個非平方剩餘,且上述方案的安全性可以歸約到這個難以找到 nQR 的假設。


作為一個完整的方案,我們還需要使用者一方提供一個零知識證明,證明內積運算的結果是正確的。這個零知識證明可以通過 Fiat-Shamir heuristic 改造成非互動式的(參考 Bulletproof,zk-STARK 等)。
關於何時把一個密碼識別為“常用密碼”的閾值,可以參考下圖。

基於平方剩餘的方案在實現的效能方面:使用者側的計算需要15秒,且可以在後臺運算;伺服器側需要為每個使用者花 0.5 秒左右的時間進行驗證。
同樣的方案還可以用於統計其他場景中的 heavy hitter 問題,例如洋蔥網路、裝置的 PIN 和 pattern、大規模服務提供商的動態密碼分佈等。
總結
通過這篇研究可以思考的一個問題是,對於這個統計常用密碼的問題,我們是否真的需要(基於計算複雜性的)密碼學?
如果使用者都是善意的,實際上密碼學的構造並不是必須的。但是如果有惡意使用者試圖操縱統計結果,則不可避免地要用到一些密碼學構造。
另外,關於攻擊者是否可以利用以雜湊值儲存的密碼黑名單列表,仍是一個有待研究的問題——儘管現在看來這似乎並不可行。
本文作者為 Conflux 演算法及理論研究主管 、密碼學專家楊光。