發表文章

目前顯示的是 12月, 2018的文章

私鑰分割 - Shamir's Secret Sharing

圖片
在做區塊鏈應用的時候,最常碰到的一個問題就是,怎麼保管私鑰,怎麼讓使用者方便,但又同時是安全的。第一個想法就是備份金鑰(不論是passphrase/keystore/私鑰),但是如果把使用者金鑰(加密)備份到自己的server,只要server的安全上有個不小心,使用者的金鑰就可能就被盜取了,就算是加密過的,也難保不會被破解。那如果切成好幾部分,有好幾份備份呢? 那怎麼切,才能確保安全呢?這就是本篇的重點啦! 最直覺的想法就是直接切成N等份,例如32bytes的私鑰分成四份,然後任三份可以組成完整的私鑰,這樣每份至少需要11 bytes。聽起來問題好像解決了,但要怎麼切分,可以保證4取3可以完整組回私鑰,又是另一個麻煩的問題(自己寫的演算法,如果沒有被完整測試過,屆時使用者的私鑰組不回來,公司的問題就大了)。 ZeroPass 有作切分金鑰並且提供備份的服務,不過找不到他們背後的演算法,後來google到 Shamir's Secret Sharing ,覺得很酷,在概念上用很簡單的數學就解決了這個問題,所以在這裡跟大家分享。 我是參考 這篇 ,淺顯易懂,不介意看英文的可以直接看。 如何拆分 先定義一下要我們接下來要幹嘛 1. 把秘密( secret )拆分成N份,並且只需M(M < N)份即可組回完整的秘密, 被拆分過的每一份秘密叫做 share 2. 建立一個(M-1)次方程式 假設,我們要傳遞的秘密是數字 3 ,然後希望3份(M=3)就能回復完整的秘密,所以要建立一個一元 二次(M-1) 方程式, y=ax 2 +bx+c 。 a跟b可以任選,而 c是秘密 (在我們的例子就是 3 ),我們選a=2, b=1,所以方程式為 y=2x 2 +x+3 。 方程式圖如下: 接著,我們任意取三點(因為M=3) , (1, 6), (2, 13), (-2, 9) 而這三個點座標就是三個 share。 最終可以由這三個點座標( share )還原秘密( secret )。 如何還原 目標是,還原(M-1)次方程式。 若取得原本的方程式,即可拿到原本的秘密。我們知道兩點可以成一直線,而三點可以定義一個拋物線。現在,我們有三個點 (1, 6), (2, 13),

What's New in Ethereum Serenity (2.0)

圖片
Ethereum 2.0 已經正式改名為Ethereum Serenity 原本預計在今年(2018)上線的Hybrid POS(Casper FFG)跟sharding,因為遇到一些技術上的困難,所以把Hybrid POS改成單純POS,然後因為sharding跟POS有部份技術是重疊的,所以把POS跟sharding併在一起做(本來是分成兩個team作開發) Beacon Chain 在Ethereum Serenity的規劃中,在原本的POW chain之外多一個鏈叫做 Beacon chain ,是一個POS chain。在Beacon chain中有兩種角色 proposer 跟 attester ,proposer就是產塊的人,attester是驗證的人。而在POW chain上存入32 ETH,可以成為Beacon chain上的 validator ,而validator有權利產塊(proposer),也會有機會被選attester。此外,延續了Casper FFG finality這個概念,也就是在finality之後的狀態就是正確的狀態(不可回復),不像POW一般需要6個塊的時間才能確認交易是不會被更改的(POW的狀態確認是機率,六個塊之後有"很高的機率"是無法被改變的,而finality就像是0跟1一樣,沒有中間)。 聽到這,好像覺得很簡單,但是在實作上會遇到幾個問題,首先,怎麼決定誰是proposer誰是attester,如果亂數的隨機性不夠,就很容易被遭到操控。接下來是,每次驗證都需要做一次簽名,因為32個ETH就可以當validator/attester,每次驗證可能會有10~20幾萬的簽章( 簽章數量的預估方法 ),驗完簽章天都黑了 XD。 RNG 針對亂數產生( RNG , Random Number Generator),使用 RANDAO 跟 VDF ,RANDAO是個利用經濟獎勵的機制來產生亂數,原始的設計是在smart contract上,而在Beacin chain會直接實作這個邏輯。而VDF是一個delay function,因為速度的關係,基金會打算自己開發ASIC晶片。關於這RNG之後會再寫一篇 詳細解釋 。 Signature Aggregatio