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

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

提出這個問題的緣由是咱們在使用Colony dApp時遇到的一個重要障礙,那就是如何應對在使用IPFS或Swarm等分佈式存儲系統保持本地存儲的dApp數據安全挑戰。java

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

共享本地存儲localStorage的問題

IPFS運行本地節點node,它與Web服務器捆綁在一塊兒。捆綁的Web服務器使節點能夠輕鬆地相互鏈接並共享網絡中其餘位置可能須要的數據。python

做爲一個去中心化的應用程序構建器,你將依賴該Web服務器將你的內容從一個節點推送到另外一個節點,從而使其能夠根據須要當即供最終用戶使用。android

假設你正在徹底去中心化full decentralized而且正在避免使用DNS或Web代理等任何內容來跟蹤你的內容在網絡上的位置,那麼訪問dApp的方式一般是經過瀏覽器使用其查詢本地節點哈希,如:程序員

http://localhost:8080/QmcefGgoVLMEPyVKZU48XB91T3zmtpLowbMK6TBM1q4Dw/web

如今,假設在正常使用期間,你的應用程序將在瀏覽器的localStorage保存數據:可能須要傳遞一些數據,或者保持本地用戶交互的隊列,以最大限度地減小鏈上交易並節省gas成本。mongodb

瀏覽器中的本地存儲僅限於特定的地址上下文(域和端口)。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語言工程師快速入門區塊鏈開發的最佳選擇。

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

相關文章
相關標籤/搜索