基于任意加密货币的用户身份认证设计思路

上文 讨论了一种链内+链外结合的,基于比特股的身份认证思路,在文末,我提到了一个思路,无须链内转帐, 本文讨论这个方案。

加密货币的身份标示都有一个特点:公私钥体系。用户自己保存私钥,但在链上广播了公钥或者由公钥生成的地址。通过链上转帐当然能确认帐号归属,但实际上,只要能向对方证明自己拥有某个对应公钥的私钥即可。 而这个证明其实非常简单:给定随机信息源,私钥拥有者能够正确签名,发给对端,对端通过公钥来验正签名是否合法。

这里面有个关键在于随机信息源,如果这个信息源不够随机,那么攻击者很可能通过重放攻击来声称自己是另一个人。为了确保随机,协议上需要加上一个限制:由对端(最后要验证身份的人)首先给定这个信息源,然后由私钥 拥有者签名发送给对端。

http(s)的服务器和客户端都可以通过这种方法验证对方。服务器验证客户端分为两个http请求:

  1. 获取随机信息源:客户端发送获取随机信息请求,包含自己的公开身份信息,服务器收到请求后,首先从区块链上检查客户端发来的公开身份信息是否合法,如果合法则生成一个随机信息,回复给客户端,并将生成的随机信息和客户端的公开身份保存一小段时间。
  2. 验证客户端身份:客户端发送服务器给的随机信息,以及签名,服务器首先测试随机信息是否是自己在一小段时间内生成的,如果OK,则通过随机信息获取客户端的公开身份信息,然后验证签名,都通过后身份认证成功,否则身份认证失败。无论成功失败,删除随机信息源。

客户端验证服务器只有一个http请求:

  1. 发送验证随机信息源:客户端发送服务器验证请求,包含客户端生成的随机信息,服务器根据客户端发来的随机信息生成签名,回复给客户端自己的公开身份信息和签名,客户端从区块链上对比公开信息,一致后验证签名,都通过后身份认证成功,否则身份认证失败。无论成功失败,删除随机信息源。

虽然这个验证方案对所有的加密货币都适用,但实际应用时,基于石墨稀的区块链(比特股、steem)更有推广优势,因为其中的用户标示不是公钥本身,更有意义。就比特股和Steem来说,Steem的单一用户名密码的上层策略对用户更友好,需要验证时, 界面直接提示用户输入steem上的用户名密码,并告诉用户这个密码不会外泄,只有生成的加密私钥保存在浏览器中。比特股客户端历史上都是用钱包模式,刚刚增加的用户名密码模式和Steem是类似的,但大多数人都还没用上,主流交易所的客户端还没有更新。

我准备按照这个思路做一个身份认证库,并弄出一个或若干个Demo来,最后整合到现有的开源论坛系统(nodebb、discourse)中。最后一步整合我不是很熟悉,读本文的小伙伴愿意参与的话请注意我的博客和公众号更新,随时和我联系。我的邮箱: pluswave AT xiaofuxing DOT name (为防止爬虫发垃圾广告,请替换 AT 和 DOT,删掉空格)。我的初步想法, 这是一个志愿合作行为,我有一个盈利计划,暂不公开。