以太坊开发时如何保证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语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文[](http://blog.hubwiz.com/2018/1...://blog.hubwiz.com/2018/12/17/ethereum-dapp-securing/)

相关文章
相关标签/搜索