硬件錢包技術白皮書(2014-5-9 更新)

1 背景

比特幣是一種網絡信息資產。不需要過多解釋,大眾都非常清楚,網絡信息資產的安全風險要遠大于實物資產。

信息安全風險主要分為兩大方面:信息泄露安全風險、信息完整性破壞安全風險。

1.1 信息泄露風險

網絡資產的所有權和控制權,只能通過賬戶和密碼。

比特幣更加極端,私鑰就是一切。因為賬戶地址可以由私鑰導出。這與之前的所有網絡資產都有巨大的區別,其他網絡資產的賬戶名和密碼在數學上沒有必然關聯,只是在數據庫里有對應關系,這也是導致大量小白弄丟比特幣的重要原因。

比特幣的支付,即控制權,由私鑰簽名完成。

當前的所有比特幣錢包,由于私鑰的生成、解密、簽名、交易信息廣播全部由同一軟件在聯網狀態下完成,所以壞人(通常理解為黑客)可以通過網絡盜走持幣人的私鑰,導致賬戶內全部的比特幣丟失。

簡而言之,如果私鑰是通過自動執行的程序與互聯網連接的,就是不安全。

(此處應配一個圖,回頭畫)

1.2 信息完整性破壞風險

如前述,私鑰是比特幣的唯一控制權。私鑰的丟失會導致賬戶內比特幣的不可逆丟失。

由于比特幣的私鑰(無論加密不加密)都是存儲在電腦(含手機)里的一個文件里,而電腦里會同時安裝執行大量的其它程序,所以備份的不善加上電腦系統的故障,可能導致比特幣丟失,這種丟失在早期發生率非常高,有人一下子就丟了上萬個幣。

所以,比特幣賬戶安全理論上和現實上都是巨大的風險,需要技術上提供有效的解決方案。這也是本產品的研發初衷。

2?提高比特幣賬戶安全的原理

基于以上分析,可以得出結論,提高比特幣賬戶安全,必須做到以下3點,缺一不可:

2.1 獨立硬件載體。

只有硬件獨立了,私鑰才不容易被黑客盜走;只有硬件獨立了,才更穩定,不容易因為電腦故障丟失私鑰。

2.2 不聯網.

只有不聯網,黑客才沒有辦法侵入系統竊取私鑰。

2.3 不與聯網的設備自動通訊

網絡只是無數通訊方式的一種,現在通訊方式多了,例如NFC,藍牙,USB,COM。只要能夠自動通訊,私鑰信息就可能被后門程序通過通訊協議自動發送到互聯網上。特別是很多通訊方式都是無線的。

以上3點合為一句話,有點繞嘴:將私鑰在物理上獨立地存放在一個不通過自動通訊方式與聯網設備通訊的載體上。

這個私鑰載體,被形象地稱為“硬件錢包”。

因而現在很多人的解決方案都是買一臺電腦,專門用來安裝比特幣錢包,不做任何其他用途。本質上,這就是一個硬件錢包。所以顯而易見,一個專用的硬件錢包,相比一臺電腦,無論從成本、易用性、安全性上,都要好很多。

紙錢包、腦錢包都是廣義上的硬件錢包,是低成本解決方案,當然也各有優缺點。很顯然,如果不差錢,還是專用的硬件錢包安全。

?3 硬件錢包的系統構成

雖然稱為“硬件錢包”,但是這實際上是一套包括多個硬件、軟件、通訊協議的解決方案,主要包括以下5個部分:

3.1 離線硬件(“硬件錢包”實物)。存儲和執行硬件錢包離線端軟件,存儲私鑰。提供與用戶互動的界面,提供與聯網硬件進行數據傳遞的硬件裝置。

3.2聯網硬件。可以是任何電腦、手機、服務器。存儲和執行硬件錢包聯網端軟件。具備與離線硬件進行數據傳遞的硬件裝置。

3.3 離線端軟件。接收付款指令,對交易進行簽名,向聯網端軟件發送簽名后的交易。

3.4 聯網端軟件。向離線端軟件發送付款指令,從離線端軟件接收簽名后的交易,并廣播到比特幣網絡。

3.5 通訊協議。離線端軟件和聯網端軟件的數據交換協議。這個協議是獨立于離線端軟件和聯網端軟件的。即未來任何人都可以基于這個協議開發聯網端軟件和離線端軟件,而這些軟件都可以相互兼容。

基于這樣一個系統,使得私鑰和聯網端軟件徹底的分離,大幅提高了比特賬戶安全性。但是其價值不僅僅是這些,更有價值的是,由于簽名過程中用戶的人工介入,離線端軟件和聯網端軟件之間公開的通訊協議,以及離線端軟件和聯網端軟件的控制權的分離帶來的多次確認,實現了對離線端軟件、聯網端軟件的信任需求為0。換言之,即便離線端軟件和聯網端軟件任何一方甚或雙方為惡意軟件,都不會導致用戶比特幣的丟失。

因而,這些軟件就不必通過開源來取得用戶的信任,因為開源其實是產生惡意軟件的重要原因(在源代碼基礎上掛上個木馬,就成為了惡意軟件;而如果不開源,則需要破解程序再掛木馬,二者的難度完全不是一個數量級)。

另外一個價值是,離線系統和聯網系統的所有權可以完全分離。例如用戶去商家消費,用戶只需持有離線系統(硬件錢包),通過與商家的聯網系統互動來完成支付。通過這種分離,使得硬件錢包的實際使用復雜程度并不比原始的一體式錢包系統高,甚至會有所降低(比如用戶完全不需下載安裝任何軟件;比如相比手機錢包大幅節省了網絡流量和網費;比如在沒有移動網絡信號i的地方,依然可以進行支付,因為商家連接了有線網絡)

4 通訊方式的選擇

? ? 基于第2條的論述,硬件錢包的通訊方式,不能是自動通訊;但同時,比特幣是數字貨幣,通訊方式又必須是數字化的。同時符合這2條的通訊方式,選擇余地就非常少了。不贅述篩選過程了,結論是,最佳通訊方式是二維碼。二維碼具有以下特點:

4.1 非自動通訊,必須有人工干預

? ?二維碼必須有一個掃描的過程。這個掃描過程必須是人工干預的,掃描攝像頭與被掃描屏幕需要一個人工對準的過程。有了這樣一個過程,就徹底無法實現自動通訊,也就徹底切斷了程序的一切潛在后門。

4.2 數字化通訊,傳輸差錯率極低

? ?二維碼是數字化的,不必贅述。二維碼的設計里已經包括了容錯機制,所以傳輸差錯率極低。

4.3 通用協議,兼容性極強

? ?二維碼是一個被廣泛接受的通訊協議。只要有攝像頭,再配合一個二維碼掃描程序,就可以獲取二維碼信息。特別是現在智能手機、平板電腦、筆記本電腦都自帶攝像頭,新增硬件成本為0,這對于應用的普及幫助非常大。

4.4 可視化,保證安全

? ? 雖然二維碼不能直接被人閱讀,但是二維碼的圖形與其解析后的信息是完全對應的。使用任何通用二維碼掃描程序都可以解析出其中的信息,等于有了“第三方公證”。所以,用戶在廣播交易之前,可以完全了解這個交易的支付對象和支付金額。基于這一特性,只采用二維碼的硬件錢包是徹底地不能再徹底的安全的。

5 簡要工作流程

硬件錢包的簡要工作流程如下(以后有時間再做漂亮的圖表):

5.1 硬件錢包創建賬戶(輸入密碼,生成公鑰私鑰對,用密碼給私鑰加密。只保存加密后的私鑰)

5.2 硬件錢包申請收款(顯示賬戶的地址,文字以及二維碼)

5.3 付款方獲取地址(抄寫文字或掃描二維碼)

5.4 付款方付款

5.5 硬件錢包申請刷新余額(二維碼顯示收款地址)

5.6 聯網端軟件獲取刷新余額申請(掃描二維碼)

5.7 聯網端軟件從比特幣網絡獲取該地址的交易記錄

5.8 聯網端軟件顯示交易記錄(二維碼)

5.9 硬件錢包獲取交易記錄(掃描二維碼)

5.10 硬件錢包獲取付款地址和付款金額(掃描二維碼或手工輸入)

5.11 硬件錢包生成未簽名的付款交易

5.12 用戶輸入密碼,硬件錢包為交易簽名

5.13 硬件錢包顯示付款交易(二維碼)

5.14 聯網端軟件掃描付款交易

5.15 聯網端軟件驗證付款交易(此處可以有用戶人工確認)

5.16 聯網端軟件向比特幣網絡廣播該交易

?

就安全問題再作一些說明:

比特幣賬戶的收款,收款方無需做任何事情,付款方廣播交易后,比特幣網絡會自動記錄。因而在收款環節,不存在任何安全風險。所有的安全風險都來自付款環節。

交易是按照標準通訊協議非加密顯示為二維碼的,任何多余的信息或者不正確的信息會被立即發現。所以,不存在私鑰泄露的風險。

用戶可以使用值得信賴的設備(如有必要,采用非聯網設備)和軟件(第三方驗證軟件,或開源驗證軟件)解析此交易信息,判斷是否有惡意行為(驗證二維碼中是否包含私鑰信息,驗證收款地址是不是用戶輸入的地址)。

因而,本硬件錢包方案從理論上徹底規避了比特幣的安全風險。即便開發者在硬件錢包中嵌入了惡意代碼,也無法得逞。

所以,用戶對于硬件錢包供應商可以是0信任,這秉承了比特幣的0信任理念。

6 通訊協議

硬件錢包的安全風險只來自硬件錢包向外輸出信息時(可能泄露私鑰),所以在此公布硬件錢包所有的向外通訊協議。這些協議都是明文的,可以用任何二維碼掃描軟件讀取。

操作 發送方 項目 長度 內容
備份 離線 指令 1 ? 0xbc
? ? 幣種 1 ?
? ? 信息長度 2 ?
? ? 錢包文件 153 ?bitcoinj格式標準錢包文件
? ? 校驗碼 4 ? HASH

?

申請同步 離線 指令 1 ? 0xff
? ? 幣種 1 ?
? ? 地址長度 1 ?
? ? 地址 34/35 ? 字符串格式的地址
? ? 最后同步時間 8 ?
? ? 最后同步交易ID 32 ?

?

發送交易 離線 指令 1 ? ? 0x88
? ? 頁數 1 ?
? ? 第幾頁 1 ?
? ? 幣種 1 ?
? ? 信息長度 2 ?
? ? 交易信息 長度 ?

交易信息的格式是比特幣協議的標準格式:

? ? ? ? bytes ? ?
header ? ? ? ? ? ?
? packetmagic ? 4 ? 包頭
? command ? ? 12 ? 信息包類型(transaction)
? message.length ? 4 ? 包長度
? hash ? ? 4 ? 包的doubledigest HASH
trx ? ? ? ? ? ?
? version ? ? 4 ? ?
? inputs.size ? 1~5 ? ?
? inputs ? ? ? ? ?
? ? outpoint ? ? ? ?
? ? ? hash 32 ? 上一個交易的HASH
? ? ? index 4 ? 第幾個輸出
? ? scryptbytes.length 1~5 ? ?
? ? scryptbytes 106~107 ? 簽名+公鑰
? ? sequence ? 4 ? 0
? outputs.size ? 1~5 ? ?
? outputs ? ? ? ? ?
? ? value ? 8 ? 支出額
? ? scryptbytes.length 1~5 ? ?
? ? scryptbytes 25 ? 公鑰
? locktime ? ? 4 ? 0