1. 程式人生 > >如何保證以太坊DApp本地儲存localStorage的安全性

如何保證以太坊DApp本地儲存localStorage的安全性

部署去中心化應用程式dapp會引入一些有趣的安全性考慮因素,這些因素可能不會出現在更傳統的開發中。我們如何保證dApp本地儲存的安全性?

提出這個問題的原因是我們在使用Colony dApp時遇到的一個重要障礙,那就是如何應對在使用IPFS或Swarm等分散式儲存系統保持本地儲存的dApp資料安全挑戰。

在本文中,我將從dApp開發人員的角度來看一下這個問題,然後研究一些可能的解決方案。

共享本地儲存localStorage的問題

IPFS執行本地節點node,它與Web伺服器捆綁在一起。捆綁的Web伺服器使節點可以輕鬆地相互連線並共享網路中其他位置可能需要的資料。

作為一個去中心化的應用程式構建器,你將依賴該Web伺服器將你的內容從一個節點推送到另一個節點,從而使其可以根據需要立即供終端使用者使用。

假設你正在完全去中心化full decentralized並且正在避免使用DNS或Web代理等任何內容來跟蹤你的內容在網路上的位置,那麼訪問dApp的方式通常是通過瀏覽器使用其查詢本地節點雜湊,如:

http://localhost:8080/QmcefGgoVLMEPyVKZU48XB91T3zmtpLowbMK6TBM1q4Dw/

現在,假設在正常使用期間,你的應用程式將在瀏覽器的localStorage儲存資料:可能需要傳遞一些資料,或者保持本地使用者互動的佇列,以最大限度地減少鏈上交易並節省gas成本。

瀏覽器中的本地儲存僅限於特定的地址上下文(域和埠)。IPFS節點是獲取此上下文的,這意味著通過IPFS Web伺服器執行的任何去中心化應用程式將使用具有讀寫訪問許可權的相同localStorage

這可能是一個大問題。

預設情況下,dApp的某些helper依賴項使用localStorage臨時將金鑰儲存在純文字中。這些資料不應該被看到的一天。

另一個潛在的洩漏問題是儲存其記憶體狀態的軟體包,以便以後可以恢復。類似Flux-like的庫通常(相對)安全,因為它們只在記憶體中執行,但啟用永續性狀態會將該記憶體狀態放入localStorage,從而將其開啟給潛在的攻擊者。

緩解問題的策略

不幸的是,安全沒有靈丹妙藥:作為一名dApp開發人員,為安全起見所做的任何調整都可能需要在開發的其他方面做出一些讓步。

以下是你可以做出的一些妥協:

不儲存任何資料

這當然是最安全的方法,但它有點像燒燬你的房子來擺脫蟑螂。在本地儲存資料的dApp中有許多功能和基本行為,刪除太多後可能沒有應用程式存在的意義了。

此外,有許多庫預設使用localStorage,你必須手動檢查每個依賴項並刪除任何需要它的庫,否則就得自己修改庫。

加密一切這在理論上更有前途,特別是因為大多數dApp開發人員已經在看板上保持預設加密。

加密的local storage值

實際上,加密所有本地儲存有點麻煩。要加密資料,必須有一個金鑰:但是使用者不能將該金鑰儲存在dApp中,因為它將被放在localStorage,這樣做你就將回到原點。

一種解決方案是使用錢包:你的dApp可能會以某種方式與區塊鏈進行互動,要求使用者解鎖其錢包以傳送和簽署交易。由於無論如何都需要錢包與dApp互動,因此可以使用每個帳戶的私鑰privatekey來加密本地儲存。

然而,這也有一些缺點:

  • 每次想要與localStorage互動時,您都必須詢問使用者的純文字私鑰。
  • 像MetaMask這樣的金鑰管理軟體不起作用,因為它永遠不會暴露使用者的私鑰。

使用Swarm和Mist

Mist是作為dApp和以太坊瀏覽器構建的,因此它為該問題提供了一些特殊優勢。

預設情況下,Mist支援Swarm的bzz協議,因此你可以設定一個ens地址指向dApp的雜湊值,然後使用Mist無需擔心地瀏覽你的dApp。

不幸的是,這隻會解決通過Mist訪問dApp的使用者的問題。

執行本地Swarm節點的使用者仍然必須通過localhost訪問,localhost仍然(可能)將資料洩露給其他dApp。

為你的dApp建立一個瀏覽器擴充套件

通過瀏覽器擴充套件程式執行你的應用程式將導致它獲得單獨的上下文(它將不再在localhost:8080),但它有點減弱了去中心化應用程式的目的,必須要依賴於像Chrome網路商店這樣的中央權威機構用於管理和分配。

此外,現在你必須為要支援的每個瀏覽器建立和維護單獨的擴充套件,並通過其自己的特定集中式應用商店進行更新。不爽。

建立一個獨立的桌面應用程式

和以前一樣,建立獨立應用程式是將dApp分離到自己的上下文的一種方式,這意味著它將獲得自己的包裝器(在本例中為electron)。

獨立的桌面應用程式具有額外的好處,可以捆綁外部庫和你可能需要的任何其他內容,包括IPFS本身的單獨例項。

和以前說的一樣,要有一些讓步:

  • 除非你想要專門在bittorrent上分發應用程式,否則你需要找到一個集中託管的解決方案來進行分發和維護。
  • 你必須為electron桌面應用程式維護一個單獨的儲存庫。
  • 如果你想將IPFS用於任何其他服務,你可能最終會在同一臺計算機上執行多個節點,這可能會變得混亂。

將你的應用代理到域名

通過使用其他Web伺服器代理本地節點,有兩個優點:

首先,現在你的dApp有一個友好的友好的人類可讀地址,而不是一個冗長的雜湊。其次,你的應用程式將擁有自己的上下文,並且不會共享localStorage。

然而,代理確實跨越了“真正的”去中心化,使用者將再次不得不依靠中央伺服器來訪問去中心化的服務。哎。

對於去中心化的應用程式開發人員來說,現在還處於早期階段。這種問題在新興的“去中心化協議棧”中無處不在“:而且在我們提出更優雅的解決方案之前可能還需要一段時間。

將來,在瀏覽器中支援本機IPFS或Swarm節點可以解決這個問題,並且無需將Web伺服器與去中心化的檔案儲存捆綁在一起。使用者可以輸入類似ipfs://QmcefGgoVLMEPyVKZU48XB91T3zmtpLowbMK6TBM1q4Dw/並直接訪問dApp,併為每個唯一的雜湊分配自己的上下文。

Mist和IPFS團隊意識到了這個問題,並希望將未來版本中的解決方案納入其中。

但是現在,找到我們可以採用的解決方法並與社群的其他人分享它們會很有幫助。

如果你是一名開發自己的去中心化應用程式dapp的開發人員,希望本文對沒構建程式碼以避免資料洩漏有所幫助,如果你設計了另一個上面未提及的解決方案,請分享它!

感謝Alex Rea和Griffin Hotchkiss幫助起草本文。

======================================================================

分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裡是原文