SQRL Secure Quick Reliable Login 安全快速可靠登陆

今天公司断网,身为一个互联网公司,断了一天的网。身为一个让网络变得更容易的公司,断了一天的网…这让我重新审视了所处的环境。

不过还是利用断网时间,详细看了一下 这个SQRL技术

下面简单的介绍一下该技术:

1. 主要使用物件作为认证的方式。现在它给的一系列技术,主要是QR(二维码)。其实最主要也就是二维码中的一个经常变化且在一定时间内唯一的Nonce串。另外我个人觉得作为扩展,现在的动态口令卡,各个银行发的电子令牌都可以归为这一类。不过SQRL使用的可以开源免费的算法,而且可以安装在任意电子设备中。所以这个是一个通用技术。比银行发的电子令牌这些更加通用。

2. 只是了消除username/password这个东西。其他的安全问题基本上没有考虑。不过这个消除不知道到底是一种进步,还是一种退步。因为它仍旧使用了另外一套复杂的密钥(公钥私钥)代替了现有的username/password简单密钥。

3. 仍然不能针对“人”这个实体做认证。偷走了手机,偷走了其他认证设备就意味着别人可以做为“你”登陆。

4. 算法详情:
每个人都有一个唯一的256bit的ID作为自己的唯一ID。这个ID再所有可以进行SQRL认证的网站上都是统一的。另外自己的设备中有一个MasterKey(主钥)。这个Master Key可以用于生成各个网站的private-public key.
4. 1 首先设备读取到了信息(扫描二维码/获取到认证需要的url) 例如:https://chillyc.info/login?sdaf9203rfnlnvq0239sdf,其中sdaf9203rfnlnvq0239sdf这个是随机生成的并且在一定时间内是唯一的。
4. 2 然后设备使用Master key 对 domain(chillyc.info) 进行HMAC 散列生成 只对 chillyc.info 有作用的private-public keys(其实这一步HMAC完全不需要,只需要生成一个不重复的private-public key然后再做一个site到private-public key的Map就好了。)

4. 3 使用 private key对https://chillyc.info/login?sdaf9203rfnlnvq0239sdf进行加密,然后发送 POST https://chillyc.info/sqrl  并且带上public=[your publickey]和sign=[刚才用private key加密的串]

4. 4 网站使用设备给的公钥对加密串进行解密。然后就取到了你的ID。这中间不需要任何 username/password. 现在讨论一下上面的算法是安全的吗?

1.  整个过程使用了Https协议,可以有效的防止中间人攻击(如果客户端检查服务器证书的话)。

2.  使用POST 发送数据,防止了某个中间代理截获url parameter,或者写入到log中。 例如网站使用的nginx,https证书也放在nginx上。然后…log中就出现了不该出现的东西。
3.  因为对每个网站(domain)都有不同的private-public key, 这样就将安全问题隔离在某个domain中,不会引起扩散。

4.  OS 需要保护好 Master Key。如果使用我建议的做一个site到private-public key的Map,那么Master Key就不重要了。但是这需要保护的就是整个Map. 看起来只保护Master Key可能更简单一些。

5.  另外SQRL 还希望,用户在扫描到二维码时,需要给用户展示一下domain,并且提示一下用户,是否对该domain进行授权。这样就防止了恶意的domain,或者假冒的domain。从算法协议层面,看起这个东西是安全的。可是仍有下面的一些不足:那个链接中有提及,我就直接照抄了。

  • How are identities backed up and/or cloned to other devices?
  • What about logging into a website displayed on the smartphone’s own browser?
  • What if the smartphone that contains my identity is lost or stolen?
  • What about password protecting logins on the phone?
  • What if the phone is hacked?
  • What about different people (and identities) sharing one phone?
  • What about having multiple identities for the same website?

对于第一个问题,我想解决的方案非常简单。可以对在手机生成一个二维码,用另外一个手机拍照,这样就能够获取到Master Key. 然后就能方便的生成site-public-private key.

对于第二个问题,其实完全可以使用JS和native app通讯。或者 browser中带有SQRL client。

对于第三个问题,这必须有一个SQRL的中心节点,该节点可以控制对已分配和已授权的Master Key进行回收和清除。不过这个问题又来了,该中心节点如何认证用户呢?看起来SQRL 这个东西不是完备的。

其他的问题我觉得…都很难解决。有些并不是SQRL这个算法协议所能解决的。

总结:
SO, 这东西看起来很美,但是它只不过用一套更加复杂的密钥机制代替了人工可记忆的密钥。让我想到:技术宅永远都不可能改变世界。他们只不过给世界一个美好简单的假象。当你仔细观察假象的时候,却发现竟然是由复杂丑陋的拼图拼接而成。该死的技术宅们…请研究一套能够真正能够认证“人”的技术。即使记忆可以移植,即使DNA可以复制,即使指纹可以盗用,即使所有的一切都可以复制。但是只有一样只会随着人本身发生变化,那就是每一个人在其生活环境、经历、岁月中造就的思维模式。你可以copy 我的文字,但是你写这个主题,不可能和我一字不差。不过这种变化的认证估计在我能看到的未来都不可能实现…