腦錢包安全性的表現究竟如何?

買賣虛擬貨幣

腦錢包安全性的表現究竟如何?關於個人錢包安全性方面,一直有個既重要又爭議不斷的話題,即何為“腦錢包”?——利用個人大腦記憶中的密碼生成所得的私鑰來儲存資金。從理論上看,腦錢包是作為長期安全儲存手段的最理想方式:只要在不使用的情況下被儲存,就不易被物理偷竊(實物)或被駭客偷竊;別人連你有錢包這件事都不會知道。然而,也有很多人對腦錢包持反對意見。他們認為人類大腦是極為脆弱的,故不適用於生產或儲存長期且易碎的密碼秘密。此外,要想在現實生活中實現該做法也非易事。到底哪一方是正確的呢?我們的記憶力是否足以保護我們的私鑰安全?說到底,一切都取決於腦錢包產生的過程。

關於“熵”

假如目前面臨的挑戰是創造一個即容易記憶又安全的腦錢包,那麼有兩個變數值得我們考量:1)人們需要記憶多少資訊;2)多長的密碼才不容易被駭客破解。事實證明,所面臨著的挑戰與這兩個變數間的關係十分密切。假定一些特定的特殊技巧缺失,而駭客又執行了一組最優演算法攻擊,且兩組完全等效(更確切一點,一組遵循另一組資料大小的變化)。那麼我們一開始就應該分別處理這兩個問題。

計算機專家、加密學家和數學家常用一段包含“熵”的資料來衡量“資訊量”的大小。籠統來說,“熵”被定義為與合理資訊量的對數具有相同“形式”的既定資訊。例如,數字57035。“57035”看似有五位數字,但其實有10萬個。16.6位熵大約包含的數字:log(216.6) ~= 10000(個)。數字61724671282457125412459172541251277是一串35位的長資料,根據log(1035) ~= 116.3(位),故實際包含116.3位熵。一個0和1的隨機字串的位長正好包含n位熵。因此可得出結論,字元越長熵越多,熵越多字元中符號的選擇也就越多。

另一方面,數字11111111111111111111111111234567890長度遠小於116.3位熵;儘管它擁有35位數,但這串數字並不是35-位數字。35-位數字屬於一個相當高的水平;一整張紙的數字上可能羅列有幾十億個數字,但它也許只有30位的熵。

資訊理論中有些比較正式的定義,試圖理清這個直觀概念。一個被稱為Kolmogorov複雜性的觀點受到廣泛熱議;一個位數序列的複雜性指可以列印出這個序列,然後停止執行的最短的計算機程式的長度。在Python語言中,上述字元也可表達為’1′*26+’234567890′——長度為18個字元的字串。而61724671282457125412459172541251277則需要37個字元(實際數字+引號)。這就使我們對“高結構字串類”的概念有了更加正式的理解:這些字串僅是簡單地對一組少量資料的集取。請注意,我們還能使用其他的數字處理策略;比如,1112111111112211111111111111111112111這樣一組不平衡的字串,;透過建立代表多個1s序列的特殊符號,能至少被切割成二分之一大。霍夫曼編碼是建立這樣一種交換理論資訊的最佳演算法的最佳示例。,

最後需注意的是,“熵”依賴於語境。“一直敏捷的棕色狐狸跳過了懶狗(the quick brown fox jumped over the lazy dog)”這句簡單的霍夫曼編碼序列可能超過100個位元組。但是因為我們會英語,又因為有很多理論文章和論文用過上面這句相同的話(即我們對這段話很熟悉),所以熵的實際數量約為25個位元組——姑且將其稱為“狐狗語(fox dog phrase)”。

那麼,熵到底有什麼意義呢?從本質上說,熵就是你需要記憶的資訊量大小。熵越多就越難記憶。因此,(從設定密碼的角度看)人們既想熵儘量的少,又想難以被破解,兩者是魚與熊掌的關係。

強度

現在,我們進入下個問題:做好密碼防範措施,防止駭客入侵。最好透過駭客猜出密碼的次數作為密碼安全性的衡量標準。破解隨機生成的密碼,最簡單粗暴的方法就是使用“蠻力”:先嚐試所有可能的1字元的密碼,再嘗試2個字元,以此類推。鑑於密碼可能有n個字母,k個長度,所以破解時間大致需要n*k之久。因此,使用的密碼字元越多越好,長度越長越好。

Steve Gibson的草垛密碼:密碼長又多,且容易記憶。這是怎麼做到的呢?

請問:以下哪個密碼更安全?哪個更容易被破解?

D0g…………………

PrXyc.N(n4k77#L!eVdAfp9

你可能看出來這是道陷阱題。答案是:第一個。第一個密碼不僅“非常”便於使用且容易記憶,重要的是,它比下個密碼要強得多!其實,第一個密碼是一串較長的字元。其中同時包含了大寫字母、小寫字母、一個數字和一些特殊符號。故要想破解這類密碼需花費比第二個這樣不可能記憶的密碼多費95倍的時間。

Steve寫道:“幾乎所有人都一直認為或被告知透過“高熵”密碼能派生出密碼自身的強度。”但正如我們所看到的,這種“智慧”是。。。不正確的!”理由是,它依賴於那些被廣泛使用的特定攻擊屬性。如果這一做法變得廣泛起來,就會促使駭客發明一種專門的方法來解決這個漏洞。此外,還有一個廣義的攻擊:只要給予一定數量的密碼洩露樣本就可以自動更新解決一切事物,請參考:馬爾科夫鏈樣本。

該演算法的工作方式如下:假設你的密碼字母符號中僅包含字元0和1。從樣本中得知,0之後的一位數有65%的機會是1,有35%的機會是0;1後面的一位數有20%的機會是0,80%的機會是1。隨機選取樣本,建立一個包含這些概率的有限狀態機,並將其放在一個簡單額度迴圈過程中:

Python程式碼如下:

import random

i = 0

while 1:

if i == 0:

i = 0 if random.randrange(100) < 35 else 1

elif i == 1:

i = 0 if random.randrange(100) < 20 else 1

print i

我們挑出輸出訊號,將其分解,就能模仿出人們實際使用密碼的方式。我們能夠將這兩種字元總結到一個完整的字母表,甚至可以跟蹤這一狀態:不只是最後一個字元,也可以是倒數兩個,或三個或更多。所以,如果人人都開始使用“D0g………………”這樣的字元,那麼在看了數千個馬爾科夫鏈之後,我們可以“學習”人們常使用的長字串。如果它輸出了一段時期,那麼它有可能暫時停留在列印出的幾個步驟迴圈週期之內——即具有一定概率性的複製人的行為。

有一個問題被忽略了,即如何終止迴圈。程式碼僅是一串包含了0和1的無限字元。我們可以在字母表中引入一個偽符號來表示一個字串的結尾,並把觀測到的符號出現頻率放入馬爾可夫鏈概率中,但不適用於以上這個例子——因為越遠的密碼大多比較短,故其輸出的密碼也比較段,所以在嘗試較長密碼前,會對短密碼進行數百萬次的嘗試重複。因此,我們可能想人工將其切斷到一定長度,並隨著時間推移增加長度。這種方法被稱為“語言模式”——按照需要,字元或詞的序列既可以簡單粗略,也可以錯綜複雜。

Gibson策略失敗、其他類似的策略也不可行的根本原因在於,熵的定義和強度是一對有趣的相等量。熵是可能性數量的對數,而力則是可能性數量。簡而言之, 記憶能力和攻擊能力完全恆定等量的!無論是從字母表還是從偏向性表中(如“1”的機率為80%,“0”的機率為20%)中隨機挑選字元,這條定理都適用。這樣看來,想要一個既安全又方便記憶的密碼是沒有希望了。。。

簡化記憶,加強攻擊難度

希望麼。。。也不一定沒有。儘管我們知道需要記憶的熵的數量和攻擊者需要闖入的空間大小是完全相同的。現實生活中,我們可以將複雜的等式將其變成我們的優勢。

最重要的是,人類儲存記憶的方式不像電腦;我們準確記住資訊的方式往往取決於記憶方式和形式。例如,潛意識中我們能記住幾千位元組的人臉,但相同位元組數量的狗臉卻很難記住,文字形式的資訊更是難上加難——但如果同時在視覺和口頭上記憶的話,會相對容易點。

有些人已嘗試利用這一優勢來生成隨機腦錢包,並用一系列數字將其編碼;例如,我們會看到如下這句話:

witch collapse practice feed shame open despair creek road again ice least

有一組熱門漫畫XCD說明了這一原理:使用者透過生成4個隨機單詞來建立密碼。這種方法看似簡潔,也不需要我們記住復這些隨機的符號和語言。但事實證明,這種方法行不通。

近期來自卡內基梅隆大學的Richard Shay和其他一些學者發表了以下這份報告:

以1,476人為樣本做了一份線上調查。調查結果顯示3-4位字元的系統分配密碼、5-6位的系統隨機分配密碼及8位 的系統分配的發音密碼。出人意料的是,系統分配密碼口令與我們之前調查的可用量熵系統結果相似。口令及密碼被遺忘的速率相當,導致使用者困難和煩惱的程度也相當。然而,參與者透過口令方式登入需花費更多的時間。口令輸入錯誤的話,還得花費更長時間進行重新登入。看來減少字元使用選擇、降低口令數量或允許使用者更改密碼順序的可用性似乎還是沒有提高。

然而,報告中還是給我們留了一絲希望。其中指出,可以有辦法透過提高熵來提密碼的高密碼的安全性,同時又方便記憶。隨機、發音的字串類似“zelactudet”(透過某種抽樣語言模型建立的詞)似乎不僅能提供一個適當的單詞列表還能隨機生成字串。

一個可能的解釋是,發音密碼能同時作為聲音和一系列字母被記憶,從而增加了字元長度。這樣看來,在不縮減密碼長度的前提下,我們至少能有一種提高記憶力的方法。

另一種策略則是對另一端產生的問題進行攻擊:在不增加熵的前提下,是密碼儘可能難的被破解。我們不能透過加入更多的組合使密碼難以破解,因為這會增加熵的數量,但如果我們利用一種被稱為硬金鑰匯出函式的東西。例如,假設人們記憶中的腦錢包為b,不適用私鑰sha256(b) 或 sha3(b),將其稱為為F(b, 1000),F的定義如下:

def F(b, rounds):

x = b

i = 0

while i < rounds:

x = sha3(x + b)

i += 1

return x

從本質上看,我們一遍又一遍的把b代回雜湊函式,直到1000個迴圈後,將數值輸出。

每個迴圈中,將原始資料代回不是必須嚴格執行的,但密碼學家們推薦這樣做以限制預先被計算的“彩虹表”遭到攻擊時受到的影響。這樣一來,檢查一組獨立密碼需要經過很多次運算。你,作為一名合法使用者,不會注意到其中的差別——是20微秒而不是20毫秒——在無需記住任何東西的情況下,就可以免費獲得10位熵。如果達到30000次迴圈,那麼能得到15位熵,但計算一次密碼需費時約1秒,20位需費時20秒,超過最高限額23位的話就不能使用了。

現在,我們有一個能走得更遠的辦法:可外包的超級土豪——KDFs。該辦法利用一組函式,而執行這組函式代價非常昂貴(如,240計算步驟),但我們也可以在不計算實體功能的前提下得到輸出資料。最簡便,但密碼也是最複雜的。利用“已盲”函式,即 unblind(F(blind(x))) = F(x),“致盲”和“解盲”需要一個一次性的隨機生成密碼。隨後計算“盲(即密碼)”,然後將工作交給第三方最好是和ASIC合作。最後當你得到結果的時候再“解盲。”

這方面的一個例子是使用橢圓曲線加密:在僅為80位而非256位的“值”處生成一條弱曲線。即透過取一個值的雜湊函式,來計算值X,並在曲線上找到相關聯的y,然後我們透過新增一個隨機生成的點N(點N與私鑰相關),“致盲”(x,y)點,最後將結果交給一臺伺服器破解。一旦伺服器得出與私鑰相對應的N + (x,y),減去n,便可得出私鑰所對應的(x,y)點——即我們想要的結果。伺服器不會知道這個值包含了什麼資訊,甚至連(x,y)是什麼也不會知道——理論上任何東西都有可能和N因素相關。請注意,使用者能即時驗證工作——只需將得到的私鑰轉換到一個“點”,並確保該點為(x,y).

另一種方法則不怎麼依賴於弱橢圓曲線的代數特性:利用雜湊函式從一組密碼中匯出20個seeds,對每個都使用一個非常難的工作證明問題(如,計算f(h) = n,n能使sha3(n+h) < 2^216),在最後使用一箇中等強度的KDF和值繫結。除非20個伺服器都串通好(如果使用者使用Tor的話就可以避免這種情況發生。因為,攻擊者不可能掌控或100%關注網路從相同使用者處產生的結果),否則該協議就是十分安全的。

這兩種協議有意思的地方在於,它們很容易對區塊鏈轉化成一種”有益的工作證明”的共識演算法;任何人都可以在鏈上提交工作,區塊鏈將執行計算,兩個橢圓離散曲線對數和基於雜湊函式的工作證明都很容易被證明。這個計劃最棒的部分在於,使用者利用計算機計算函式產生的費用變成社會使用,且攻擊者的成本更加昂貴。如果區塊鏈對工作證明提供資助,那麼透過提交工作給區塊鏈是攻擊者嘗試破解使用者密碼的最佳方式。但現實生活中,像計算一個密碼需進行240次工作這種級別的安全性,腦錢包個其他的密碼會變得非常安全以至沒人願意花費時間和精力去破解。

熵“差”

現在到了最後一步,也是最有意思的一步:記憶方法。從上面討論中可知,熵是一段資訊中的資訊量,資訊量等於攻擊的複雜性——除非你使用昂貴的KDFs故意降低處理過程。然而,關於熵還有一點需要被提及,這點至關重要:熵依賴於語境。對我們而言,“Mahmoud Ahmadjinejad”這個名字可能有10到15位熵。但對那些生活在伊朗的人,總統“Mahmoud Ahmadjinejad”可能只有4位熵——在VIP名人榜單中他很有可能排在前16位。我不瞭解你的父母或配偶,所以對我而言他們的名字可能有20位熵,但對你而言可能只有2-3位熵。

這是怎麼一回事呢?從形式上看,最好的辦法就是想想每個人 之前的生活經驗創造 某種壓縮演算法,更具不同的壓縮演算法或不同的程式語言,相同的字串可以得到不同的柯爾莫哥洛夫複雜性。在Python語言中,’111111111111111111′ 即’1′*18,但在Java指令碼中’111111111111111111′是Array(19).join(“1″)。在Python演算法的一個假象版本中,將變數x預設為’111111111111111111′,就只是個“x”。最後再舉個例子,雖然挺起來比較做做,但其實最能說明現實世界:人的心靈就像是一臺基於我們過去經驗,有著許多不同預設的機器。

現在,我們繼續深入地來看一下這個問題。現在,選擇書中的一個短語或歌曲作為自己的密碼被普遍嘲笑為是一個不值錢的方法。但為什麼這個方法曾經很誘人呢?因為它看似善於利用差異:一組短語可能有超過100位的熵,但你只需要記得書名、書頁和行數即可。但問題是,別人也能看到這本書。駭客要想做一個能強行攻擊與該資訊相關的所有書籍、歌曲和電影的程式是件非常簡單的事。

這個建議其實不值錢。為什麼這麼說?如果僅作為密碼的一部分,那麼從書、歌曲或者電影中擷取資訊是一個不錯的選擇。理由很簡單:它製造了差異。從你最喜歡的歌曲裡摘選一句歌詞對你而言只有幾位熵。但不是所有人都喜歡這首歌,所以對其他人來說這句歌詞可能有10或20為熵。最佳策略是挑選你真的很喜歡的書或歌曲,但也最大限度晦澀難懂的(小眾)——降低自己的熵從而提高他人的熵。當然,在你的使用者名稱前追加一些隨機的字元(甚至一些隨意組成的單詞,如“zelactudet”),並利用安全的KDF。

結論

擁有多少位熵才算是安全的?眼下,破解密碼的晶片每秒可嘗試236次破解,比特幣礦工每秒可以執行約240次雜湊函式(即1 terahash)。整個比特幣網路,總計進行 250次/tahashes,即約257次雜湊函式/秒。密碼學家普遍認為,280是可接受的最小安全水平。要想有80位熵,你需要約17個隨機英文字母或12個隨機字母、數字和符號。然而,我們可以降低點標準:一個使用者名稱有15位,一個好的KDF有15位,從歌曲或書籍中摘選的所寫能有10位,剩下的40多位仍用舊計劃中的隨機選擇。如果你用的KDF不是很好,也可以選擇其他密碼成分。

資訊保安專家普遍認為取消密碼必然是不安全的,他們主張要對密碼設定方案進行徹頭徹尾的更換。一種常見的說法是,基於摩爾定律我們知道攻擊者的力量沒2年會增加1位熵,故為保護密碼安全,人們不得不記住越來越長的密碼。但是,這一說法不完全正確。如果你使用強力KDF,那麼基於摩爾定律,一旦攻擊者增長攻擊力量,使用者便能獲取增長的這部分力量。

腦錢包安全性的表現究竟如何?若真如上述說法,除KDFs(較溫和的,不是可被外包的那種)外,暫時還沒有其他選擇。總而言之,密碼目前依然保持著過去所擁有的安全性,並繼續作為一種強大的安全策略要素存在——但不是唯一要素。像同時使用硬體錢包、可信賴的第三方和腦錢包這組溫和的方式最終可能成為主流。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;