脑洞大开,前端 LOGIN 界面模糊登录实现, 原理是利用 QRCODE 里错误纠错功能,对用户输入的密码进行纠错处理。

2016-03-18 10:03:01 +08:00
 3dwelcome

首先给用户表增加一个字段,起名为 ECC(Error Correction Code)纠错字段。为每个已注册用户的密码,进行 QRCODE 里等级 H 的 30%容错数据恢复功能。

然后服务器根据前端 HTML POST 提交上来的密码,进行模糊配对。比如说有个用户叫 v2ex, 密码为 v2expassword, 用户在某次登录的时候,错误的把密码输成了 v3expassword, 登录失败。这时候就针对密码,做修复处理, ECC(v3expassword) = v2expassword, 和数据库匹配,登录成功。

3153 次点击
所在节点    问与答
19 条回复
wujichao
2016-03-18 10:04:40 +08:00
我数学差,谁能帮我算算按照 30%的容错, 公用多少个密码可以击中正确的密码
wujichao
2016-03-18 10:04:48 +08:00
我数学差,谁能帮我算算按照 30%的容错, 共有多少个密码可以击中正确的密码
pimin
2016-03-18 10:10:11 +08:00
你这个容差不如基于用户习惯设定容差
比如这个用户经常输错密码
正确密码的 1364579
但是用户经常打成 2Bqingnian ,打完之后又可以打成对的登录
长期以后默认 2Bqingnian 为第二密码
3dwelcome
2016-03-18 10:30:41 +08:00
30%容错不会存在大量撞库, ECC 预处理是需要先确定密码长度的,然后用多项式来识别密码字符串中,那几个字符有潜在错误问题,最后尝试修复。

黑客那种完全不知道你密码长度,只凭借用户名,就要猜出正确或者接近的密码,几乎不太可能。
imn1
2016-03-18 10:41:44 +08:00
明文保存密码么?
SpicyCat
2016-03-18 10:46:19 +08:00
岂不是要明文保存密码?
3dwelcome
2016-03-18 10:47:04 +08:00
可以不用明文的, MD5(ECC(v3expassword)) = MD5(v2expassword)

计算好 ECC 后,就完全不需要密码明文了。就算数据库被盗,只靠 ECC 字段的多项式数据,也没办法还原密码,数据量太少了。
3dwelcome
2016-03-18 10:52:17 +08:00
数据库里存的是密码 hash ,但每次用户登录是, POST 提交用户密码的时候,需要明文传输,不过也是安全的。

具体请见另一篇文章: Nurbs 三维曲面传输明文密码,保证不被中间人窃听。就是把密码当作平面 X,Y 坐标,投影到三维空间后变成 X,Y,Z 加密传输,服务器端拿到三维坐标,再投影到平面还原密码。中间人没有 nurbs 公式,没办法还原密码。
imn1
2016-03-18 11:09:56 +08:00

那在什么时候算 ECC 呢?用户设定密码的时候?
输入的时候如果没有明文对照,“容错”概念是什么?

其实怎么讨论也没用,密码不能容错
因为一旦容错,权责就分不清了
ctsed
2016-03-18 11:12:39 +08:00
我改密码就只改第一个字符,这样岂不是旧密码还能登录
3dwelcome
2016-03-18 11:21:26 +08:00
"那在什么时候算 ECC 呢?用户设定密码的时候?", 第一次写数据库前,把明文密码做 ECC 处理,生成 ECC 多项式字段保存在数据库里,然后把明文密码变成哈希密码,存到数据库密码字段里。

ECC 神奇的地方,是修复后,只需要凭借修复字段和模糊错误密码,就能猜出原正确密码,计算出密码 hash 。

举个例子,你 winrar 加入的压缩修复功能后,数据有部分损坏也能自我修复,并不需要保存一个原数据副本的,你只要有原文的哈希值作为对比就可以了。和不用保存明文密码一个意思。

---------------
"我改密码就只改第一个字符,这样岂不是旧密码还能登录"
模糊登录本来就是干这个的,哈哈。
menc
2016-03-18 13:58:43 +08:00
乖乖地用安全性高的密码吧少年,
以十位密码为例, 30% 为 3 位容错

密码字符取:大小写 52 个 + 数字 10 个 + 特殊字符 32 个(自己去键盘上查一下) = 94 个

则被认为是正确密码的错误密码有
94 ^ 3 * C(10, 3) - 1 = 99670079 个, 近一亿个密码是可以命中的。
menc
2016-03-18 14:01:46 +08:00
建议去学习信息论, QR Code 的信息冗余是充分的,加上 QR Code 的信息量不大,所以修复是简单的。

另外,请让安全工具回归安全的本真,不要想着在这里优化用户体验,一旦有人被通过错误密码成功登录了,根本就是没办法摆脱罪责的事情。
3dwelcome
2016-03-18 14:15:08 +08:00
黑客并不知道用户的密码位数是多少,假设盲目暴力猜测,一位一位的穷举尝试, 93 + 93^93 + 93^93^93 ... 一直尝试到第九位攻击结束,近 5260677251 亿次密码攻击是完全无效的,然后才开始有效攻击。
menc
2016-03-18 15:05:47 +08:00
@3dwelcome 笑尿,你至少算一下期望好不好,你这是什么计算方法。

你这种奇怪的计算方式,万一用户的密码是 000000^&*呢?本来挺强的密码,用 00000000 直接就登录成功了。尝试实验次数: 1 次
cnnblike
2016-03-18 15:11:44 +08:00
看了下楼主注册时间,原来如此……
jedihy
2016-03-23 07:27:23 +08:00
一个很大的问题是,你怎么优化你的数据库去做这样的查询。动辄以此登陆几十上百次查库,你的网站能支持多少人登陆?
3dwelcome
2016-03-23 09:24:44 +08:00
@jedihy 你没理解,不需要几百次查库的。用户在全密码匹配登录失败的时候,才会触发系统的纠错,这种情况很少的。而这时候,仅仅只需要一条查询,就可以把单一用户的恢复数据取出来,就一个 blob 小字段而已。

举个不恰当的例子,就是类似正则的密码模糊匹配登录。
xavierskip
2016-03-23 19:41:47 +08:00
脑洞太歪了。铜币拿走,不送

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

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

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

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

© 2021 V2EX