ZeroWallet

Chang-Wu Chen
Jul 25, 2019 · 10 min read

Special thanks to Chih-Yun Chuang (AMIS’ Cryptography engineer) for review

背景介紹

ZeroWallet 利用零知識證明 (Zero Knowledge Proof) 的方式來強化私鑰保護,希冀提供腦錢包的便利性與多簽錢包的安全特性。本錢包專案是一位在 UIUC 暑假實習的高中生 Aman LadiaAndrew Miller 教授的指導下完成的作品,以下是展示與源碼:

操作方式

如果進入到該錢包的 demo 頁面,會如下圖所示:

登入畫面

使用者透過輸入

  1. 使用者帳號
  2. 自訂的密碼一 (Password 1)
  3. 自訂的密碼二 (Password 2)

結果:產生用於以太坊錢包的一組私鑰及一個 share (如圖)

ps. 這個 demo 只是 PoC,證明私鑰產生與還原的可行性,並不是真正的錢包應用,但概念上有許多有趣的部分

輸入使用者帳號,以及兩組密碼,產生私鑰與備份用的 share

私鑰產生方法

為了較好理解本文介紹的 ZeroWallet,我們先從幾種私鑰產生的方式與演進,了解其優缺點及背後設計的動機。至於為什麼私鑰的產生與保管如此重要,本文暫不贅述,可以簡單理解為在密碼貨幣 (Cryptocurrency) 的世界,私鑰代表唯一能夠動用錢包資產的鑰匙(授權),同時亦扮演著身份(認證)。

這類私鑰的產生方法,通常牽涉到產生亂數,而透過該亂數混亂的程度產生一把具有固定長度的私鑰,如下圖。而私鑰產生後,由於它代表你個人資產的授權與認證關係,故私鑰一但掉了,也意味著,你的資產將再也回不來。

不同於傳統的網頁登入密碼,你需要記住的是一串 64 個字元的十六進位數字,除非你有過人的記憶力,否則通常最好的保存方式是抄在紙上護貝起來,並藏在安全的地方。

與第一種方式不同於,亂數會轉成人類易讀的助記詞(紅色部分),例如 12 個單字,好處在於若是要抄寫十六進位的字元時,容易搞混,而單字也比較不會抄錯。如此一來,只要知道助記詞如何轉換到私鑰的計算過程,就可恢復私鑰,同時讓抄寫或輸入的部分減少人工的錯誤。這也是目前手機錢包或硬體錢包中,常見的做法。

這邊要提到一種古老的秘密分享技術,Shamir’s Secret Sharing (SSS),該種技術可將一個秘密 (Secret),根據他的設定拆分成 t-of-n 的規則,即當你有 n 個 share 時,只要拿到任意 t 份(門檻),就可還原既有的秘密,下圖是一個 2-of-3 的例子,每個藍色框框裡的數值稱作 share,拿到任意兩份就可回推黑色的秘密(私鑰)。

與上述兩種方法相比,這樣設計的好處是一但助記詞或私鑰遺失,不會立即遭受損失。因為三份 share 的其中一份,可以放在保管箱或其他安全地方,用於備份,並且另外兩份 share 也可放在異地,使有心的竊盜人士要一次性盜走的困難度增加。

但更重要的是,這類需要多個 share 來還原秘密的方式,在 policy 的設計上也較有彈性。例如 share 1 & 2 分別給 A & B 兩人,每次交易時,A 必須拿出 share,並由 B 檢查交易內容正確無誤,才拿出 B 的 share 來完成交易,相較之前的方式多了再次確認與檢查的特性。(類似銀行層層簽核的流程)

進階閱讀可參考:Kimi Wu 的私鑰分割文章

了解第三種私鑰的產生方式後,我們能否透過預先計算的 Share 來還原私鑰?而不是先有私鑰,才來計算如何拆分 share,這是本專案作者的切入點。

稍微調整計算的步驟後,如下圖所示。先前,我們提到,如果 share 保管在異地,那麼要同時偷走可用 share 的難度就會變高。因此,作者將其中一個 share 託管給服務商,並且需要同時拿到使用者的密碼與服務器的秘密才能夠還原 share 2。至於 share 1 則由使用者自己保管,share 3 做為備份,當使用者自己不慎遺失 share 1 或是服務商不慎弄丟使用者的 share 2 時,可用於復原私鑰。

除此之外,對使用者來講,需要記住的是使用者帳號與兩組一開始設定的密碼,而不是冗長的私鑰,亦不是 12 單字的助記詞,比較符合傳統的使用體驗。

研究挑戰

有了 SSS 的概念與初步背景介紹後,接下來的挑戰是,如何設計 share 2 的產生方式?

  1. 服務器端會針對不同使用者存一個 Secret。
  2. 如何讓服務器端無法知曉 share 2 如何產生?

這邊會利用到 OPAQUE 的算法,OPAQUE 本身是一種 PAKE (Password Authenticated Key Exchange) 協定的演算法,用於以密碼驗證的金鑰交換協議。

工作原理

首先,要理解工作原理之前,需了解不經意偽隨機協議 (Oblivious Pseudo-Random Function, OPRF)。OPRF 在此主要是生成一個隨機亂數,而 OPRF 函數的輸入來自兩個不同方,屬多方計算 (MPC) 的一種應用,兩方的人彼此不知道輸入的值是什麼,但僅有一方能知道結果。

這對於 share 2 的產生有很大的幫助,原因是:

  1. 使用者並不想同時儲存 share 1 與 share 2,想委任第三方託管。
  2. 使用者又不想託管方知道 share 2 的產生方式。
  3. 如果沒有使用者的參與,僅有託管方的部分訊息是無法計算 share 2。
  4. 託管方即使掉了參與用的訊息,或是訊息被中間人調包,只會造成使用者生不出 share 2 或是產生錯誤的值,使用者仍保有備份的 share 3 可用於還原,但託管方無法學習任何有用的結果,亦即此處零知識證明的用途。

下圖是 share 2 產生的過程,左邊是使用者,右邊是服務器,紅色代表秘密,僅能握有秘密的一方才能知道,即便是中間人都不該拿走秘密值。

  1. 使用者端會產生一組隨機數 r,並且設定一組使用者密碼,僅有使用者才知道這兩個秘密。
    (註:使用者每次向 server 請求協議的執行,r 每次不一樣)
  2. 利用雜湊函數計算密碼的雜湊。
  3. 將密碼的雜湊值作為橢圓曲線上的 x 座標,找到對應橢圓曲線上的 y 座標,即將雜湊值化成一個座標點 (x, y),並以該點 P 作為生成元 (generator)。
    (註:將雜湊值化為點座標要有點技巧,不是每個 x 座標在橢圓曲線上都有對應的 y 值)
  4. 計算 α,基於離散對數 (Discrete Logarithm) 問題的假設,若不曉得 r,要從 α 與 P 還原 r 是非常困難的,接著將 α 送給 server 端。
  1. Server 端針對每一使用者,挑選一個秘密值 Ks,並保存在其資料庫。
  2. 假設 Server 端某種方式知道使用者的 ID,便可從其資料庫取出 Ks。
  3. Server 端接著利用使用者傳過來的 α 與自己才知道的 Ks 計算 β,並傳給使用者。
  4. 由於要解開 β 的 Ks 也是離散對數問題,使用者並不曉得 Ks 是什麼,傳輸過程中他人也無法知曉。
  1. 待使用者收到來自 Server 端計算的 β 值後。
  2. 使用者會計算 r 在橢圓曲線上的反元素 m。
  3. 並利用 m 計算 rw。
    (註:推導過程如圖,可注意到過程中 r 和 r 的反元素會消掉,因此即使每回合使用者選擇不同的 r,都不會影響最後 share 2 的生成)
  4. 最後,使用者利用自己設定的密碼 (pw) 與 rw,計算雜湊值作為 share 2 的結果。
Protocol
  1. Share 1:使用者一開始會設定兩組密碼,其中一組密碼 (pw1) 的雜湊值即為 share 1。
  2. Share 2:使用者利用另外一組密碼 (pw2) 與每次挑選的隨機數 r,與 Server 交互後所得的結果。
  3. Share 3:在已知 Share 1 與 Share 2 的情況下,利用 SSS 還原 secret,並計算 share 3,又或是利用內差取另外一個值。

(註:在 2-of-3 的情況下,也許先有 share 才還原 secret 也許可行 (線性),但在 3-of-5 (二次式)或更高次時,不一定能夠直接由 share 推回 secret)

為了分開 share 的存放,Share 1 則由使用者自己保存,Share 2 只在每次交互時才產生,Share 3 則可離線備份或藏在安全的地方,如此,即完成 ZeroWallet 產生私鑰與互動的過程。

小結

整個 wallet 的運作與流程如上,是個非常有創意的方法,透過傳統密碼的記憶來產生私鑰,讓使用者毋須記憶冗長的私鑰,並透過多方計算的方式,讓私鑰必須借助多個 share 的組裝才能進行還原,並且有 recover 的概念,讓離線備份的 share,在 Server 無法使用的情況下,可用於還原。

這是個有趣的作品,但值得注意的是,使用者在拿到足夠 share 之時,即可組出私鑰,甚至當下可記住私鑰。換言之,在使用的過程中,仍有私鑰被組出的可能性,即使他的安全性相對只存私鑰的作法更佳。

私鑰的保管與防護,在區塊鏈上一直都是重要的研究挑戰,不論是在安全性或在使用體驗上,都與傳統的密碼登入有所不同,更重要的是,私鑰代表著資產,不像傳統上忘記密碼就請求重送般簡單。

門檻式簽章

Threshold Signature

安全的多方計算 (Secure Multi-Party Computation, sMPC) 以及門檻式密碼學 (Threshold Cryptography) 都是密碼學上已有但古老的技術,透過門檻式簽章的方法 (Threshold Signature Scheme, TSS),讓我們可在不還原私鑰的任何情況下,每次產生一組針對同一地址的合法簽名 (Signature),進而保護私鑰安全,由於私鑰並不會存放在任何資料庫,並且多個 share 分散在不同 Server,而增加攻擊困難度。除非多個資料庫同時被駭,且攻擊者取得足夠的 share,以及知道組裝的手法,才有可能被還原回來。細節就暫不敘述。門檻式簽章的方法與研究,是目前本團隊 (AMIS) 已有且用於錢包服務上的技術。

延伸閱讀

getamis

Using breakthrough blockchain technology, Amis has created a standardized platform to let business create information exchange systems and make transaction data open and shareable to improve the quality of life for everyone.

Chang-Wu Chen

Written by

getamis

getamis

Using breakthrough blockchain technology, Amis has created a standardized platform to let business create information exchange systems and make transaction data open and shareable to improve the quality of life for everyone.

More From Medium

More on 中文 from getamis

Hao Chen
Feb 11 · 9 min read

142

More on 中文 from getamis

More on 中文 from getamis

深入了解 Segregated witness (segwit)

徐粲邦
Nov 21, 2019 · 16 min read

316

More on 中文 from getamis

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade