1. 與本地存儲相關
Base58
- 主要用於產生Bitcoin的錢包地址(對應的就是熱存儲或者冷存儲的地址);
- 採用的字符集合爲“123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ”,從這不難看出,Base58是純數字與字母組成而且去掉了容易引起視覺混淆的字符(0:數字零,O:大寫O,I:大寫i,l:小寫L)。9個數字+49個字母=58個。由於沒有特殊字符所以在採用鼠標雙擊或移動設備選擇時可以自動識別全選。Base58本身就是URLSafe。Base64的URFSafe模式雖然已經對URL支持的比較好,但UUID1[1]中還是包含“-或_”。目前流行的比特幣,採用的就是Base58Check編碼,是在Base58基礎上又增加了安全效驗機制。
存儲比特幣需要完成3個目標,但往往是不能兼得最終需要對其進行均衡:
- 可獲取性:要用的時候可以隨時隨地地使用;
- 安全性:保證沒有其他人可以動用你的比特幣,保證這個比特幣是你自己的;
- 便利性,密鑰管理應當是簡單易行的。
首先從安全以及便捷的角度來看,不應該把所有的比特幣存在當地,因爲這樣會很容易引起臃腫(就像你不會將所有的都放在自己的口袋裏隨身攜帶,而是將一部分存在銀行或者微信裏面)。所以就有了比特幣錢包的實現。
錢包的作用:
-
一個簡單的接口,告訴你錢包裏有多少比特幣。
-
使用比特幣的時候,處理關於密鑰管理的一切技術細節,比如使用密鑰或生成新的地址等
-
比特幣送達的地址:
-
一種是字符串:base58記號法2,將字母中的容易混淆的去掉,留下了58個
-
一種是QR(Quick Response)碼:一個二維碼代表比特幣地址的字節,通過掃描可以很方便的掃出來
-
虛榮地址:有些商家或個人將地址轉換成一些人能夠識別的字符。方便一種心理暗示對於某些特定場合會使用到,比如:博彩公司網站中本聰骨頭(Satoshi Bones)的收款地址中就含有“骨頭”(bones)
-
如何實現:地址都是通過哈希計算產生的隨機字符串,如果要指定某一個位置的值是固定的,那麼就需要一個個去遍歷,58種字符,那麼k個固定字符就需要平均生成次數
-
由於如果直接使用1中的方法會使得計算次數巨大,所以進行了相關優化加速:
- 這是每一次計算的hash函數:,正常情況下就是不停地生成地址,直到得到想要的結果爲止。
- 主要優化地方:對下一次的計算進行優化,利用上一個結果去計算下一個結果,使指數運算級別變成了乘法運算的級別。
-
-
-
-
2. 冷存儲以及熱存儲
2.1 定義
-
熱儲存:把比特幣放在你的個人電腦裏就像把錢放在錢包裏帶着——隨身攜帶,隨時隨地存取;
-
冷儲存:是離線的,把比特幣鎖在其他地方。
2.2 冷熱存儲之間如何轉移
2.2.1 主要轉移思路
冷熱存儲使用不同的私鑰,這樣的好處就是當一方處於危險的時候另一方並不會受到威脅。那麼如何在這兩個存儲庫中轉移呢?
- 需要知道對方的地址或公鑰
當冷熱存儲庫進行轉賬的時候,並不需要相互共同在線,這就使得不至於那麼容易暴露,等在線的時候再進行接收
2.2.2 轉移的兩種方式
爲了私密性得到保障,我們希望轉賬的地址不是一成不變的,否則惡意的就很容易找到被轉賬的人:
-
方法一:通過在之前傳輸一系列地址,之後可以按照順序進行使用這一系列地址;
- 缺陷是爲了傳送地址,我們不得不經常讓冷儲存端上線
-
方法二:分層確定性錢包Hierarchical Deterministic wallet (HD Wallet)[2]
-
定義:在沒有私鑰參與的情況下,由公鑰直接分散成子公鑰,並且分散的子公鑰可以由分散的子私鑰認證。
-
過程圖示:
-
-
兩種方法的區別:
- 方法一交易頻繁,每筆交易需要不斷備份,錢包是一堆隨機生成的私鑰的集合,這種叫做非確定性錢包。
1. 當前市確定性錢包場現狀以及遵循的3個標準
-
現在市場上的大部分數字貨幣錢包都支持HD Wallet,而且用戶可以通過助記詞在不同的HD Wallet之間相互導入導出賬戶
-
這是由於大多數都遵循了3個標準:BIP32、BIP39、BIP44
- :定義HD Wallet的核心提案。
-
錢包可以通過種子來生成主私鑰,然後派生海量的子私鑰和地址,按照樹狀結構存儲。
- :由於種子是一串很長的隨機數,讓種子更便於記錄轉換爲一串單詞,一般由12個單詞構成,稱之爲助記詞(mnemonic code,phrase);就像下面的:
good gather ranch lunar edit hospital comic final fee coin athlete rescue
-
:提出了5層的路徑建議,類似於軟件定義網絡使之能夠適合更多幣種更多賬戶,在 BIP32 的基礎上,賦予樹狀結構中的各層不同的意義,
- 最終的效果就是:用戶只需一個種子,就能控制所有幣種,所有賬戶的錢包。各層定義如下:
m / purpose'(44) / coin_type' / account' / change / address_index
- $ purporse’ $固定是 44’,代表使用 BIP44。
- 而 用來表示不同幣種,例如:
- Bitcoin 0’,
- Ethereum 60’。
- :表示賬戶。
- :表示交易的種類
- 常量0用於外部鏈 用於在錢包外部可見的地址(例如,用於接收付款)
- 常量1用於內部鏈(也稱爲更改地址) 用於在錢包外部不可見的地址,用於返回交易變更。
- :表示生產的地址序號(因爲有多個子地址),地址按順序遞增的方式從索引0開始編號。
2. 實際中的公私鑰生成
ECDSA的工作機制如下:通常一個ECDSA私鑰是一個隨機數,其對應的公鑰是。爲了生成分層確定性密鑰,我們需要另外兩個隨機數和。
- 私鑰生成信息:
- 第個私鑰:
- 地址生成信息:
- 第個公鑰:
- 第個地址:
3.通過標準化之後的從種子到私鑰的過程:
- 生成一個
助記詞
(BIP39 mnemonic code)。 - 助記詞使用PBKDF2轉化爲
種子。
- 種子通過使用HMAC-SHA512生成主
私鑰。
- 通過主私鑰派生出
子私鑰
(BIP32),其中節點佈局由BIP44設置。
4. 熱存儲如何保護私鑰以及助記詞等的隱私
既然mnemonic code這麼重要,除了需要用戶進行備份外,那些熱錢包是如何保護的私鑰,助記詞之類的呢?
-
以太坊:
-
官方錢包:
-
採用 KDF 的形式;
-
-
MetaMask:一個開源的以太坊錢包
-
是將助記詞加密後存在瀏覽器的Local Storage中,而解密需要使用用戶設置的密碼。這裏的核心就是:保存私鑰或者助記詞,是加密保存的,如果不那麼做,就等同於明文密碼。
-
明文密碼不一定就有問題,明文並不代表就一定不安全。加密過的也未必就安全。當然還有一次中心化錢包和交易所,都是把一定比例的幣進行冷存儲,留一些放在熱錢包裏,做到熱冷分離。
-
-
2.2.3 幾種實現錢包的方案
1. 大腦錢包
原理是用一個可預測的算法把一個口令變成一對公鑰/私鑰,你可以選擇一個哈希算法將口令轉譯成一個私鑰。在給定私鑰的情況下,可以用同樣的方法得到私鑰。之後可以用分層確定方法生成一一系列私鑰
安全性:
- 黑客猜到你的口令的話,他還是可以偷走你大腦錢包裏的所有私鑰
- 黑客可以下載一堆未被使用的比特幣的地址,然後用電腦程序去慢慢地試錯,黑客都不需要知道大腦錢包的地址,這被稱爲離線猜測或者密碼破解。
- 所以最終就看口令的複雜度
增加安全性的方法:
- 可以讓程序生成密鑰的速度變慢(爲程序加入一個延遲);
- 把本來很容易計算的哈希函數SHA-256算上220次,這樣一來就把黑客的工作量增加了220倍。
2. 紙錢包
把密鑰印在紙上,然後把紙鎖在保險箱裏
3. 防損硬件
用它來保存密鑰或用它來生成密鑰,總之,此類設備本身不會泄露密鑰或輸出密鑰,而只是在我們按下設備的某個按鈕或輸入設備密碼後顯示密鑰的保管狀態。
4. 總結
大腦錢包就相當於一種映射,將口令映射成公私鑰,主要看口令存在哪才知道它是冷存儲還是熱存儲,而紙錢包和防損硬件這種都是冷存儲,都是放在一個地方進行加密鎖好,等用的時候再拿出來
3. 安全性
- 熱儲存端的安全性較低。如果熱儲存受到損害,那麼上文提到的非相關性就不復存在,但這種情況下,私鑰(以及比特幣)仍然是安全的。通常,分層確定性錢包支持任意多個安全等級——這也是“分層”的由來——雖然,我們還沒有討論細節。這種安排非常有用,例如,當一家公司內部存在多種授權級別時,就需要這種特性
- 冷儲存如何保存信息(私鑰或私鑰生成信息)。第一種方式是將信息保存在某個設備(例如筆記本電腦、手機或平板電腦,或U盤)中,然後將這個設備好好保管,最好是讓這些設備斷開網絡,並將其鎖起來,這樣,如果有人想盜取信息,那麼他首先需要進入這些設備的保存處。
參考文章:
2.數字貨幣錢包 分層確定性錢包介紹(HD wallets)