以太坊有一个非常强大的JavaScript生态系统。有一些很棒的开源项目,比如ethereumjs-util
,它提供了一个用以太坊帐户签名的即插即用功能。
JavaScript的一个缺点是,在许多领域,它带来了安全问题。一个这样的安全风险是显而易见,这是由于我努力在EthTools.com
上实现持久性认证(仍然是一个正在进行的被警告了的工作)。
利用开源项目(如ethereumjs-util)来签署任意的数据消息是相当容易的。然而,不容易的是告诉服务器有人已经成功地验证了某帐号的所有权。
当然这也不是绝对正确的,你也可以很容易做到这一点。简单地构建一个简单的API端点,并在成功认证后向其发出请求。
真正的问题是,创建一个“假”请求并将其发送到上述(易于识别 - 只需在控制台中查看)端点非常容易。 我可以轻松发出请求,说我已经验证了任何帐户的所有权。
凭借尖端技术……特别是处理“真实价值”的技术,尤其重要的是安全性体现出了它应有的重要性并被重视,特别是在历史上出现各种被利用的攻击的情况下。
而且即使是在初期,以太坊也吸引了最优秀的人——那些知道在做什么的人。如果有安全漏洞,有人会找到它。
现在。。虽然可以确保AJAX请求和伪造更难,但几乎不可能使交易100%的安全。我需要另一种方式。
我最终解决的方法是选择最简单的服务器端认证方式。
对每个人交易都是可视化的
在客户端中与区块链交互的一件大事是,在任何情况下,任何人都能清楚地看到你在做什么。他们可以自信地知道你没有把他们的私人钥匙发送给别人。怎样?他们可以查看控制台并查看每一个发出的请求。
如果一个服务在任何地方POSTing
我的私钥,我会非常担心。
在我们实现的认证流中,用户可以看到我们没有在任何地方发送任何数据——所有的东西都是在客户端中完成的。
遗憾的是,我的身份验证方案中确实需要POSTing
数据。但也不用担心(有些人可能不同意)。
我们POST
身份验证的公钥到我们的API端点。虽然你不能用服务器上的公钥来验证我们所做的事情,但我们并没有用你的公钥做任何恶作剧——这就是为什么它是公开的。
在服务器上,我们使用提交的公钥来验证提交的签名是由具有相应私钥信息的人创建的。这里要明确指出,我们不知道你的私钥,但椭圆曲线加密允许我们通过简单地使用公钥来验证签名是否是使用它创建的。
在ethereumjs-util和