一种无需密码的开放协议登录方式

2020-10-09 01:12:54 +08:00
 weitch
互联网上到处需要密码,为了方便记忆人们喜欢用同一个密码,一个网站被黑客攻破后你的密码就泄露,其他网站也关联被攻破造成更多隐私泄露。

后来出现了 OAuth 登录方式,但这种方式是一种中心化的登录方式,中心平台决定了用户信息的提供,比如微信决定给开发者提供什么样的权限,而且随时可以以各种借口屏蔽、限制开发者或用户的账号,从而造成服务的中断。
这就使得用了 OAuth 登录的网站或 APP 为了双层保障又让用户重新填写提供邮箱、手机和密码。


于是,我在思考,有没有一个更好的方式来解决这个问题。


受到比特币去中心化方式的启发,我们都知道比特币最重要的是它的开放协议,不同的客户端有不同的实现方式,但它们都遵守同一协议,它们就可以实现通信。
所以,我就在想,我们是否能实现一个这样的标准化登录协议,接入协议的无论是网站、开发者、用户,就能实现统一的登录方式,因为是开放的协议,所以就不再受制于任何一个平台。


具体实现:
1,用户要登录网站时,网站生成一个登录码(其实是一个 api 接口),任何实现了登录协议的客户端收到接口后都可以向接口发送加密数据(包括登录、授权信息读取、退出、永久注销等等功能)。
2,本地客户端收到登录码后从本地选择一个账户或生成一个新的账户私钥,通过一定的方式生成加密数据发送给网站,网站收到数据后解析出公钥、登录有效时间等信息完成登录。
3,各个网站的登录私钥、以统一的格式保存在本地客户端。
4,用户可以随时加密导出私钥数据包,导入到其他客户端。
---------------------------------------------------------------------------------

整个登录过程,用户不再需要提供密码,各个网站的登录信息,用户自行保管。


我们唯一需要留意的是客户端的安全,通过社区开源、社区鉴别等方式能让用户自由选择一个安全可信赖的客户端。
而且,因为是去中心化的,即使某个用户的终端被黑客攻破,不会对其他用户产生影响,不会出现大面积的数据泄露的情况。
5525 次点击
所在节点    奇思妙想
42 条回复
lvybupt
2020-10-09 09:14:06 +08:00
看到这个帖子,我就想到了胎死腹中的 eid 。

公安部强制要求网站支持。用户无需注册无需密码。网站除了获得用户登录成功之外,获得不了用户的任何其他信息。
当年也没有这么强烈的被监管的抵触情绪,依然推广不成。

归根结底的原因就是一个便利性。 无论是当初分发的 usb 版 eid,还是依托工行的数字证书版,都不如账号口令来得便捷。

任何想要替代口令登录却达不到相同便捷性的方式,都不可能成功替代口令。
weitch
2020-10-09 10:26:05 +08:00
@cmdOptionKana #13
的确,这是个很大问题。
正如同比特币一样,如果丢失了私钥,那就丢了币。当我们把掌握私钥的权力下放时,就得要求用户有更多自我保护的能力。感觉这是无法调和的矛盾,依赖于中心时我们就失去很多权力,而当我们自己独立时又会失去很多不便。
threebr
2020-10-09 10:34:33 +08:00
有没有觉得抛开去中心化这一点,电信运营商提供的手机号一键授权登录 api 已经做到了楼主想做的事情。
clf
2020-10-09 10:35:08 +08:00
直接用 TOTP 登录得了。
weitch
2020-10-09 11:01:12 +08:00
@shynome #16
哈哈,看样子似乎我们想到一块了,而我还停留在想,你已经开始动手做了,加油。
shynome
2020-10-09 11:19:31 +08:00
@lychs1998 TOTP 只能做二次校验,不能用做登录,因为只有 6 位数字,直接爆破就完事了
shynome
2020-10-09 11:26:20 +08:00
@weitch 其实这个东西已经有人在做了,叫做 “DIF 认证”,但要推广起来感觉遥遥无期,至少还得 5 年,10 年吧
shynome
2020-10-09 11:34:11 +08:00
关键词好像是 DID auth,我搞不清了,是以前卡在做用户登录的时候找到的

现在我登陆的解决方案是用户名+密码注册,后续的话需要 TOTP 验证通过才能使用,避免用户账号被爆破盗用
oxogenesis
2020-10-09 13:31:53 +08:00
有了密码学账号的个体
如何在网络空间活动?

直接给答案:当然是使用密钥签名一条消息,然后发送给目标

这里我选择使用 json 作为组装消息的格式

使用测试账号:
Address:o8Tjmes6iAukirYrBosSY9ntC5ahqz9ztK
PublicKey:0203411B7B6FA68C59DE640CA6E4648A60BFFA17020BAD5B47C7CDE58431D70D43


先构造基础消息
{
"Action":201,
"Content":"Hello world...",
"PublicKey":"0203411B7B6FA68C59DE640CA6E4648A60BFFA17020BAD5B47C7CDE58431D70D43"
}

Action 是消息类型(为什么用 Action 不用 Type,因为消息是个体在网络空间的活动)
Content 是消息内容
PublicKey 是消息生成账号 o8Tjmes6iAukirYrBosSY9ntC5ahqz9ztK 的公钥

使用账号 o8Tjmes6iAukirYrBosSY9ntC5ahqz9ztK 的密钥对消息签名
Signature:3044022018C52C995C094392113EC322E270EFAD854219701C53C6DEA791B0B139129A9E02203DF614DC1671A1E939B77AA840CE847E2DC39971FE2C9212A9C35C40A29283D0

对基础消息增加签名,可以得到
{
"Action":201,
"Content":"Hello world...",
"PublicKey":"0203411B7B6FA68C59DE640CA6E4648A60BFFA17020BAD5B47C7CDE58431D70D43",
"Signature":"3044022018C52C995C094392113EC322E270EFAD854219701C53C6DEA791B0B139129A9E02203DF614DC1671A1E939B77AA840CE847E2DC39971FE2C9212A9C35C40A29283D0"
}

可以使用 0.1.0 版的 oxo-chat-client 右小角的<校验 Json>对这条消息进行校验

前面提到用公钥可以算出账号地址,
其次校验签名需要的三个参数是:基础消息、公钥、签名

因此在基础消息中加入公钥,第一可以表明消息的生成账号,第二可以用于后续的签名校验,是必要的

加入签名后的消息,修改任意一个字符都无法通过校验,
(这在数学上是可以被证明的,可以被证明的才是可信的,因此我信仰数学 [In Math, I believe] )
由其不可改变的特性,我称其为原子消息。

使用这条原子消息,个体可以实现了“使用账号 o8Tjmes6iAukirYrBosSY9ntC5ahqz9ztK 在网络空间上进行了一次活动 /操作”,其他个体无法使用账号 o8Tjmes6iAukirYrBosSY9ntC5ahqz9ztK 做出操作。


========================================================
作者:o5rdqyAP36HG6HTCHbiTNh1GJ7kvKk4Z5m
序号:4
https://oxo-chat-server.com/bulletin/25CDE89E60E8E7E2AF66F344502D22E8
oxogenesis
2020-10-09 13:35:45 +08:00
可以不可以更大胆一点,个体(你们所谓的用户)使用开放协议定义的操作消息,与互联网系统进行交互。
带签名的操作消息,本身就带有账户信息。

========================================================
作者:o5rdqyAP36HG6HTCHbiTNh1GJ7kvKk4Z5m
序号:49
https://oxo-chat-server.com/bulletin/FFCF5755ED28B85DC136338983DF399A
weitch
2020-10-09 14:03:48 +08:00
@lvybupt #21
唉,的确是很难,如果想提高便利性,就得从设备端底层提供支持,比如浏览器、手机厂商内置等。然而这些恰好都掌控在大厂手里,而使用密码登录最大的受益者其实又是他们,他们自然不会蠢到进行自我革命。

人们把信任越是集中到那些大厂身上,他们的优势就越加明显,就更能提供更加便利的服务,人们就越加得依赖,这时他们再设置各种关卡收费(比如微信收你的认证费用,苹果收你的苹果税等等),你就拿他没有任何办法。

总的来说,人类社会自下而上的变革太过罕见,人们的习惯性思维很难接受。
lvybupt
2020-10-09 14:37:54 +08:00
@weitch 其实有一些替代口令的的方案得到了推广,比如指纹。 归根结底还是是不是足够便利。
去中心化几乎是不可能的。
onevcat
2020-10-09 16:53:09 +08:00
不妨看看这个? https://solidproject.org

当前前提是能成,当然这个前提不是可能的...毕竟资本主义,这从来都是一个社会问题,而不是一个技术问题。
flynaj
2020-10-09 16:56:02 +08:00
楼主说的就是证书登录了,用了多少年的东西了!基本上银行都在用。
firefox12
2020-10-09 17:24:25 +08:00
关键的一点 你的证书掉了,你就没机会修复了。 其实你的证书也是很容易被盗取的。比密码更安全,但是并没有更好。本质就是你把一个公钥放在一个服务器端了。
weitch
2020-10-09 23:07:51 +08:00
@oxogenesis

OXO 上一下线,聊会
cnZary
2020-10-09 23:26:21 +08:00
https://login.live.com/login.srf
微软在用很久了,很好用
oxogenesis
2020-10-10 07:53:10 +08:00
@weitch 今晚等你,加我 o5rdqyAP36HG6HTCHbiTNh1GJ7kvKk4Z5m
oxogenesis
2020-10-10 12:20:25 +08:00
加这个账号吧,oWWWabB6NvMFzUxwjNXFs4V9unjZFNFyi (最近痴迷于生成定制账号,这个账号是 oWWW 开头)
可以先看看使用教程: https://github.com/oxogenesis/oxo-chat-tutorial
oxogenesis
2020-10-10 18:28:50 +08:00
@weitch 我上线了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/713159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX