以太坊開發時如何保證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語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裏是原文[](http://blog.hubwiz.com/2018/1...://blog.hubwiz.com/2018/12/17/ethereum-dapp-securing/)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章