原文链接:https://medium.com/@mycoralhealth/learn-to-securely-share-files-on-the-blockchain-with-ipfs-219ee47df54c
在阅读本文之前,我们推荐你先阅读这篇文章:200行代码实现一个区块链之一-----最简单的区块链
最近对于区块链都火到发烧了。区块链是一项令人兴奋的技术,围绕着它有许多不错的应用,比如加密数字货币和ICO。区块链提供了一种民主化的信用机制,它不同于传统的中心化的信用机构(比如银行)。区块链可以应用于医疗健康、金融服务、社交APP等。
然而从技术视角来看,区块链技术存在一些弱点。现在广泛使用的PoW共识机制将交易速度降低到几乎不可忍受的程度。等待比特币交易完成是一件令人很不爽的事情,以太猫这款应用几乎要将以太坊网络卡到宕机。
这使得在区块链上存储数据和大文件成了一件毫无希望的事情。如果区块链只能存储很少的字符串以及俩点之间的转账记录,那什么时候我们才能利用区块链来存储文件和图片?难道区块链智能用来存储一些字符串吗?
进入IPFS
现在最有希望的解决方案是采用IPFS,又叫星际文件系统,它是由Protocol Labs创建的一个项目。它是一个点对点的分拣存储协议,每个节点都存储一部分被Hash索引的文件。如果一个客户端想获取其中一个文件,它只需要请求那个文件的Hash值,IPFS网络根据这个Hash再从存有这个文件的节点将文件传输给这个客户端。
你可以认为它的工作方式类似于BitTorrent。IPFS是一种类似于BitTorrent的分布式文件存储和查找系统,但它给用户提供了更多的控制权限,以及更丰富的编程接口。
通过下图可以理解IPFS的工作流程。
假如John想通过IPFS将这个文件分享给同学Mary,他只需要将第3步中获得的Hash值告诉Mary,对于Mary来说,她要做的就是按照1-4步的反操作来做就可以了。Mary要做的就是利用IPFS调用这个Hash值,然后就可以从IPFS中得到这份文件的拷贝,太酷了!
安全漏洞
这里存在一个明显的安全漏洞。只要有人获得了这个文件的Hash值,他们就可以从IPFS中获取到这个文件。所以重要文件不适合以原生状态存在于IPFS中。除非我们采取对这些文件做一些处理,否则通过IPFS来分享重要的文件(比如健康数据和图片)将不合适。
进入非对称加密
幸运的是,在文件上传到IPFS系统前,我们有许多方法来加强文件的安全措施。非对称加密允许我们用特定接受者的公钥来对文件进行加密,这样只有这个特定的接受者才能解密这个加密文件。如果有恶意的第三方从IPFS中获取到加密文件,他们将不能解密这个文件。在这个教程里我们将用GPG来进行非对称加密。
非对称加密的工作流程见下图。
1 John想上传PDF文件到IPFS,但是只给Mary访问权限
2 他将PDF文件放到工作目录里面利用Mary的公钥进行加密
3 他通知IPFS想上传文件,IPFS对文件加密,并产生PDF文件的Hash,
4 他的加密文件上传到IPFS网络
5 Mary从IPFS网络获取到PDF的加密文件,并用私钥解密这个文件从而得到PDF
6 第三方不能解密这个文件
区块链
区块链如何和这个关联起来?在我们继续之前,我推荐你阅读我们以前的文章:200行代码实现一个区块链之一-----最简单的区块链
我们的区块链最重要的部分可以用这个图表示:
图片来自“Code your own blockchain in less than 200 lines of Go”
注意其中的BPM字段。现在的区块链还只能处理这种简单的文字记录,这也是为什么加密数字货币非常适合用区块链来做。你所要记录的就只是发送者、接收者和要转账的比特币数目(或以太坊等)。因为所有这些数据的Hash都要被计算和验证以保持区块链的完整性,所以用区块链来存储文件和图片绝对是一件很恐怖的事情。
这也是为什么IPFS和区块链结合起来会如此强大的原因。我们不存BPM而直接存储文件的Hash!这真是一件很酷的事情!我们保持了区块链的数据简单性,同时又可以享受到IPFS带来的文件存储和分布式的点对点特性!这是一件双赢的事情。由于我们应用GPG的非对称加密来提供安全性,我们拥有一种非常优雅的方式来在区块链上“存储”(其实是存在IPFS上)、加密和分享大量数据和文件。
改进的区块链框图
一个真实世界中的应用将在每个区块中存储我们的健康或实验数据的引用。当我们得到一个新的实验结果时,我们创建一个新的区块来存储加密文件的引用,而这个图片或PDF文件的加密文件是存储在IPFS网络中。
谈的够多了,让我们行动起来!
在这个教程中我们将做下列的事情:
你需要准备的东西:
够了,让我们开始吧。
安装GPG
让我们在俩台电脑上都下载GPG安装包。按照这篇文章的指示去在你的操作系统上安装。在Mac电脑上,如果已经安装了Homebrew,最简单的方式就是打开终端输入brew install gnupg。
当GPG装好后,按照下面的方式去在每台电脑上产生秘钥:
输入gpg --gen-key然后根据提示选择默认选项就可以了,对于你选择的用户名和Email,确定记住和保存了密码。
当电脑上出现gpg叫你做一些随机事情来产生秘钥时,只需要随机敲打键盘直到这个过程完成。
当第二台电脑上的秘钥生成后,我们需要将这个秘钥添加到第一台电脑,第一台电脑可以根据这个秘钥来加密文件,这个加密文件只有第二台电脑才能解密。
在第二台电脑上输入下面指令来导出秘钥到一个文件中,其中的Email邮箱地址是你创建秘钥时用的邮箱:
gpg --export --armor
将刚才生成的pubkey.asc拷贝到第一台电脑。当拷贝到第一台电脑后,像这样引入这个秘钥文件:
gpg --import pubkey.asc
可以输入命令gpg --list-keys来检查秘钥文件是否成功导入。我在第二台电脑用的名字是Cory Heath,它正确的显示出来了:
太棒了!我们已经成功完成了GPG的安装,现在转到IPFS.
安装IPFS
对俩台电脑,按照这篇文章的指示去在你的操作系统上安装IPFS。当安装完后,对每台电脑,用ipfs init命令去初始化IPFS,用ipfs daemon命令去运行IPFS的实例。
太好了!我们已经完成安装工作,现在我们去加密和上传文件到IPFS。
加密
让我们加密刚才下载的文件。先将这个文件命名为myriad.pdf,然后用第二台电脑的用户名去加密这个文件。
gpg --encrypt --recipient "Cory Heath" myriad.pdf
如果用ls命令检查你的工作目录,会发现一个新文件myriad.pdf.gpg
只有第二胎电脑可以解密这个文件。试一下!将它发送给其它的朋友,他们打不开它,及时将它重命名为myfiad.pdf也没用。
我们得到了pdf的加密文件,让我们上传它到IPFS。
上传到IPFS
在第一台电脑上,运行命令
ipfs add myriad.pdf.gpg
将得到输出
这个以Qm开头的字符串就是文件的Hash。你可以将这个Hash发送给你的朋友,他们就能够使用这个Hash值从IPFS下载这个文件了。我们用这个命令检查一下这个文件是否在IPFS上面:ipfs pin ls
从IPFS下载文件
在我们的第二台电脑上,根据刚才得到的文件Hash值,运行以下命令来获得刚才在第一台电脑上上传的加密文件:
ipfs get QmYqSCWuzG8Cyo4MFQzqKcC14ct4ybAWyrAc9qzdJaFYTL
从输出来看已经成功下载这个文件:
解密
我们现在是在第二台电脑上,而这个加密文件是用这台电脑上的公钥进行加密的,理论上可以用这台电脑的私钥进行解密,让我们实验一下。运行以下命令来解密这个加密文件,并且将解密后的文件另存为myriad.pdf。
gpg --decrypt QmYqSCWuzG8Cyo4MFQzqKcC14ct4ybAWyrAc9qzdJaFYTL > myriad.pdf
关键时刻到了!我们打开这个文件试一下:
open myriad.pdf
太棒了!我们成功下载、解密和打开了我们上传到IPFS的受保护的文件,而其他人是没有访问权限的!
总结和下一步
给你们自己一个奖励吧!我们刚才完成的是一个非常强大的功能,它解决了当今区块链技术中非常关键的一个点。
让我们回顾一下我们刚才做的:
你在这里学到的东西对你来说非常有用,有许多地方可以应用到这些知识。你可以发布这个例子到线上服务器来充当你自己的IPFS节点以存储重要文件。IPFS的缺点是你的文件不能广泛传播开来,一旦你停止你的节点,你的文件将从IPFS网络中消失。为了克服这一点,你可以运行一系列云服务器来当做IPFS节点,你可以用他们来当服务主机,直到有更多节点对你的文件感兴趣并且开始存储它们。