我们通过区块链进行Web身份验证


我最近参加了以太坊黑客马拉松,今天我想谈谈EtherAuth项目,MixBytes团队凭借该项目获得了第三名。 EtherAuth尝试使用外部帐户制作分散的网站登录版本。 作为按钮,只能通过Facebook登录,而不能使用Facebook。


问题与解决方案


如果要为网站上的用户设置一个封闭区域,则必须选择:开发自己的系统以识别,验证和授权用户,或使用现成的解决方案。 交钥匙解决方案意味着您的用户已经在某些系统(Facebook,Google,Yahoo,Outlook,甚至只是电子邮件)中拥有帐户。 然后,您使用适当的机制(通常是OAuth 2.0协议)来确保尝试使用外部用户ID登录到您网站的人就是该用户。


后一种方法更易于实现,但对用户来说是有风险的:如果他的主要帐户发生了某些事情(例如,Facebook会在没有给出原因的情况下阻止该帐户),那么他也将无法访问您网站上的信息。
另外,如果作为用户我要登录到一个我不信任的站点,则我面临向该站点提供对我的个人信息(例如电子邮件或年龄)的访问权限的需求。 如果该站点仅支持使用外部帐户登录,那么我必须做出选择:拒绝使用该站点或牺牲我的匿名性。


大多数用户最终都用“这样可怕的事情发生了,我没有什么可隐瞒的”这个词来牺牲匿名性。 不幸的是,大多数针对未准备好用户并导致资金损失的攻击都以类似的词开头。 “如果我从SMS向银行员工发送代码,会发生什么可怕的事情?” “如果我向技术支持员工发送请求标头,会发生什么可怕的事情?” 这个问题的答案通常是什么也做不了的时候就找到。


以太坊如何在这里提供帮助? 我们已经意识到存在三个主要问题:


  1. 用户没有义务信任他访问的网站,并希望避免泄漏个人信息。
  2. 该站点希望使用外部身份验证系统来避免存储用户数据和相关的安全成本。
  3. 现有的向站点提供身份验证功能的外部系统具有审查的危险。 任何帐户都可以随时被封杀,而无需解释,有时甚至无法恢复。

我们可以使用以太坊网络代替外部系统,并仅在其中存储必要的数据集。 我们必须注意不要在公共领域中存储秘密信息,但是由于以太坊网络上的任何钱包实际上都是一对具有加密强度的密钥,其中公钥确定钱包地址,而私钥永远不会通过网络传输,只有所有者知道,我们我们可以使用非对称加密来认证用户。


在最简单的情况下,您可以将以太坊钱包地址用作用户ID。 但是这里出现一个问题:如果发生密钥泄漏,用户将永远失去对系统的访问权限。 更准确地说,从攻击者知道用户的秘密密钥或只是偶然不小心使用户的秘密密钥落入公共访问的那一刻起,我们就不能使用这种密钥进行身份验证。


实作


在我们的解决方案中,我编写了一个简单的EtherAuth智能合约来存储用户ID和关联的钱包地址。 用户ID只是长度在2到32个字节之间的UTF-8字符串。 它是由用户自己发明的,后来又用于登录到任何支持EtherAuth的站点。 今天,我将对字符串中可能包含的字符进行限制,剩下使用拉丁字符和阿拉伯数字(7位ASCII编码的子集)来限制创建外部相似登录名的能力。


在EtherAuth中创建帐户时,设置了一对密钥:授权密钥(authAddr)和恢复访问的密钥(recoveryKey)。 名称recoveryKey并不完全成功,因为此地址用于管理帐户,而不仅仅是用于恢复。 创建时,两个地址都等于发送交易的钱包地址。 但是关心自己安全的用户应该创建一个单独的控制密钥,并将其存储在网络上无法访问的位置。 我什至会以12个助记词的形式安全地将其保存在纸上,并在必要时允许重新创建几个键。


明智的做法是,使用单独的钱包地址进行身份验证,将其与存储所有以太币的钱包地址分开。 仍然可以通过分析智能合约的交易顺序来跟踪authKey与创建帐户的钱包地址之间的关系。 现在,您无法在创建帐户时设置单独的authKey和recoveryKey。 但是,如果您沿该方向优化智能合约,则创建帐户的地址不一定与帐户所有者相关联,这将使每个人都能保护自己的匿名性。


为了与智能合约进行用户交互,我们创建了一个单独的网页。 您可以在其上创建帐户,更改其密钥或将其删除。 要工作,用户将需要安装MetaMask浏览器插件。 如果您已经在积极使用以太坊网络,则很可能已经安装了此插件,也就是说,大多数希望通过以太坊进入该网站的用户在其路径上不会遇到其他障碍。


使用EtherAuth的常规用户身份验证过程如下所示:


  • 该站点(后端)变成一个智能合约并接收用户的以太坊地址;
  • 站点(后端)生成并记住一些消息,并要求用户使用authKey地址对该消息进行签名;
  • 位于站点(前端)上的用户使用MetaMask插件对消息进行签名并将其发送到后端;
  • 站点(后端)会验证签名,如果一切正常,它将根据其选择的逻辑激活用户会话。

在我们的黑客马拉松解决方案中,为简单起见,我们将后端和前端部分结合在一起,得到了一个大型前端。 在现实生活中,重要的是,身份验证验证必须在非用户控制的环境中进行,也就是说,不是在浏览器中,而是在服务器上。


在遇到的问题中,我们可以在前端部分注意到签名的验证。 浏览器中不支持椭圆曲线,因此我不得不向智能合约添加一个函数,该函数可从消息中返回ecrecover结果,并学习如何正确地将参数传递给它(从MetaMask签名的消息中获取参数)。


结果,在两天内,我们收到了使用以太坊网络和MetaMask插件的去中心化身份验证的概念证明。 我们了解如何优化此系统,以便为用户添加匿名性。 用户可以在其主密钥泄漏的情况下恢复访问(但在恢复密钥泄漏的情况下则不能)。 分散式系统不受Google或Facebook等大型机构的审查。 如果需要检查,则站点应自行执行检查,但是只能在自己的系统中执行检查,而不会影响用户对其他系统的访问。 以太坊网络不能很快进行交易(创建帐户时,用户可能需要等待几分钟),但是可以非常快速地获取数据和验证用户身份。 该解决方案具有很好的可伸缩性,因为有许多带有数据的节点,任何人都可以随时添加一个。 为网站所有者实施这种解决方案的复杂性不高于实施对OAuth 2.0支持的复杂性。


结论


当然,与Facebook用户数量相比,如今使用以太坊网络的用户可以忽略不计。 但是,区块链技术的普及正在增长,我相信在可预见的将来,这样的用户将越来越多,这意味着在工业系统中可以使用分散式身份验证。


参考文献


Source: https://habr.com/ru/post/zh-CN423039/


All Articles