1. 程式人生 > >真有這種操作,比特幣、暴雪和下載盜版電影都應用了同一種算法

真有這種操作,比特幣、暴雪和下載盜版電影都應用了同一種算法

算法

在ICO泡沫迅速湧起和迅速破滅後,比特幣仍然一路高歌,在最近突破了9600美金的大關。作為一種獨立於貨幣體系的數字加密幣,比特幣成功的本質還是要歸功於技術——區塊鏈的安全和隱私支撐起了比特幣最核心的價值。

提到區塊鏈,非對稱加密算法和哈希算法是兩個不能避開的技術名詞。尤其是哈希算法,在區塊鏈相關的技術文章中總能看到這個名字,卻很難真正理解它的奧秘。今天,我們就來看看哈希算法是如何保護比特幣和其他數據的?

學好哈希算法,用腦子儲存比特幣

如果你準備購買比特幣,你就會擁有一個“比特幣錢包”。通常來講,比特幣錢包會是一個移動/本地客戶端,用戶可以通過客戶端進行交易。但是還有一種更高端的玩法:腦錢包。

技術分享圖片

我們知道,比特幣實際上是一種“資源”,它並不是像文檔一樣躺在誰的U盤裏,而想要確立這種資源的所有權,則需要由用戶自己生成一串數字密鑰並儲存到某個地方。交易時,先生成一套只能由交易中某一方用來解密的私有密鑰,再根據私有密鑰單向加密生成雙方都能看到的共有密鑰。

由於密鑰的生成是獨立於比特幣協議和區塊鏈的,所以如何保護好自己的密鑰成了一個大問題,以前甚至發生過黑客破解比特幣錢包客戶端獲取比特幣的事件。

為了避免這種問題,就有人想出了一個新方法:自己生成一段比特幣密鑰,然後記在自己腦子裏。

生成比特幣密鑰的方式並不難,最初始的密鑰只是一串256位的二進制數字,拋二百多次硬幣即可得到。但想記住二百多個0和1實在是太復雜了,腦錢包概念的關鍵在於,用哈希算法SHA-256對密鑰進行校驗,讓256位二進制數字變成更短的編碼,就可以保證讓這串字符適合人腦記憶。

來自國家安全局,怪不得哈希算法很安全!

不管是拋二百次硬幣用腦子記憶的腦錢包,還是在移動端、PC端作為客戶端的電子錢包,基本都繞不開用SHA-256算法校驗這一步驟。

其實SHA-256算法發明的最初目的和比特幣毫無關系,1993年,美國國家安全局設計了一套用於安全加密的密碼散列函數——Secure Hash Algorithm,翻譯過來就是安全散列算法。人們更願意把它叫做SHA,1993年推出的版本名為SHA-0,後來隨著算法不斷的被破解又不斷自我修正,最終推出了數個SHA算法的變體,其中就包括SHA-256。

技術分享圖片

SHA最主要的特性就是,接收到二進制數字消息時會形成一串“數字摘要”,而這一摘要還可以用來驗證數字消息的完整性。如上文所示,SHA-256就意味著算法可以把256位的二進制數字進行壓縮。

很多人會感到疑惑的是,哈希算法對數字進行壓縮、摘要,那麽為什麽不可以根據這些摘要反向“破解”呢?

哈希算法與其說是“加密”,其實更接近於“壓縮”。這其中涉及到一個“映射”的概念。所謂映射,我們可以理解為“代表”。舉個例子,可以用ABC這樣的字符去代表10001101這樣的數字,字符A可以代表1、001、0001等等,但只得到字符A時,我們無法得知加密前的數字究竟是1還是001還是0001還是……

用更簡單的案例解釋一下:在比特幣交易中,交易雙方都能得知的共有密鑰是“100”,但只有其中一方知道加密前的私有密鑰是2+78+5+5+10。

得到100這個共有密鑰的人,想要破解私有密鑰只能去挨個去排列“1+0+0+0+99”、“1+1+0+0+98”……如果變成256位的密鑰,幾乎是一個不可能完成的任務。而想要驗證公有密鑰也很簡單,既然加密前的私有密鑰是2+78+5+5+10,那麽99、98這些公有密鑰就都是錯誤的。

忘記比特幣,下載過盜版電影的你早就認識了哈希算法

所以,目前看來哈希算法的壓縮功能最大的用處是在比特幣交易加密上?

實際上哈希算法最大的用處還是壓縮數據,之所以被用在比特幣上,是因為其中包含的大量運算貼合了以“消耗資源來獲取比特幣”的規則。在其他領域中,哈希算法也能發揮很大作用。

一個比較典型的例子是遊戲公司暴雪推出的“One Way Hash”算法。

技術分享圖片

作為手握魔獸爭霸、星際等等數款大型遊戲的企業,暴雪和其他企業一樣,擁有一個巨大的數據庫。而當數據庫太大時,從中檢索就成了一個巨大的麻煩。

通常情況下在數據庫中尋找數據就像在KTV點歌,數據庫是曲庫,想要找到自己要點的歌,只能把曲庫從頭到尾翻個遍。但也有一種更簡單的方法,那就是建立一種代表關系,把歌曲名字《小星星》簡寫成XXX,並把這種對應關系儲存在數據庫中。尋找歌曲時,如果連XXX都找不到,說明曲庫中不可能存在《小星星》這首歌。

同理,《小星星》=XXX、《愛我中華》=AWZH,這種文字轉化成拼音、拼音取首字母的對應方式在現實應用時可能會涉及到函數、坐標等等數學問題,總之這種對應方式被稱作“哈希表”。

但我們在KTV點歌時,搜索XXX得出的結果不光有《小星星》、還有《笑哈哈》,面對這種同一字符串在哈希表上位置相同的問題,暴雪的程序猿們想出了一種絕妙的解決辦法——在哈希表中用三個哈希值來校驗位置。

也就是說在暴雪KTV的曲庫中,《小星星》(xiaoxingxing)的哈希值可以分別是XXX、OGG和III,這時再搜索歌曲,就幾乎不會遇到《小星星》和《笑哈哈》同時出現的情況了。

同樣的作用也體現在P2P(點對點)傳播上。如果是上古時代的互聯網用戶,可以對emule(電驢)這款下載軟件有印象,在eMule上可以從全球所有eMule用戶手中接收某一件文件的數據上行和下載。

其原理就是,當你想下載電影《戰狼2》時,系統會提取《戰狼2》的哈希值,通過對這一哈希值的搜索,可以發現所有擁有《戰狼2》的用戶,大家一起進行點對點的數據傳送,eMule本身也不用建立數據庫,只搭建平臺就可以了。因為哈希算法的壓縮特性,使得“全球搜索”這件事變的低成本並可行。

技術分享圖片

雖然那個具備共享精神的好時代一去不復返,但即使是今天哈希算法也依然活躍在我們的視野中,即使有很多人聲稱自己破解了哈希算法,卻也沒有發生過因為算法被破解而造成損失的情況。

目前來看,哈希算法如果被拋棄,無非是出現以下兩種情況:第一,量子計算開始應用,哈希算法和已知的所有密碼、加密方式都被強大的計算能力和速度打敗。第二,出現了更好用的壓縮算法,比如美劇《矽谷》中的魔笛手成真,哈希算法由於不好用而被開發者拋棄。

評估一下以上這兩種情況出現的可能性,相信大家就能知道哈希算法還會陪伴我們多久了。


真有這種操作,比特幣、暴雪和下載盜版電影都應用了同一種算法