首先给用户表增加一个字段,起名为 ECC(Error Correction Code)纠错字段。为每个已注册用户的密码,进行 QRCODE 里等级 H 的 30%容错数据恢复功能。
然后服务器根据前端 HTML POST 提交上来的密码,进行模糊配对。比如说有个用户叫 v2ex, 密码为 v2expassword, 用户在某次登录的时候,错误的把密码输成了 v3expassword, 登录失败。这时候就针对密码,做修复处理, ECC(v3expassword) = v2expassword, 和数据库匹配,登录成功。
1
CDuXZMAPgHp1q9ew 2016-03-18 10:04:40 +08:00
我数学差,谁能帮我算算按照 30%的容错, 公用多少个密码可以击中正确的密码
|
2
CDuXZMAPgHp1q9ew 2016-03-18 10:04:48 +08:00
我数学差,谁能帮我算算按照 30%的容错, 共有多少个密码可以击中正确的密码
|
3
pimin 2016-03-18 10:10:11 +08:00 via Android
你这个容差不如基于用户习惯设定容差
比如这个用户经常输错密码 正确密码的 1364579 但是用户经常打成 2Bqingnian ,打完之后又可以打成对的登录 长期以后默认 2Bqingnian 为第二密码 |
4
3dwelcome OP 30%容错不会存在大量撞库, ECC 预处理是需要先确定密码长度的,然后用多项式来识别密码字符串中,那几个字符有潜在错误问题,最后尝试修复。
黑客那种完全不知道你密码长度,只凭借用户名,就要猜出正确或者接近的密码,几乎不太可能。 |
5
imn1 2016-03-18 10:41:44 +08:00
明文保存密码么?
|
6
SpicyCat 2016-03-18 10:46:19 +08:00
岂不是要明文保存密码?
|
7
3dwelcome OP 可以不用明文的, MD5(ECC(v3expassword)) = MD5(v2expassword)
计算好 ECC 后,就完全不需要密码明文了。就算数据库被盗,只靠 ECC 字段的多项式数据,也没办法还原密码,数据量太少了。 |
8
3dwelcome OP 数据库里存的是密码 hash ,但每次用户登录是, POST 提交用户密码的时候,需要明文传输,不过也是安全的。
具体请见另一篇文章: Nurbs 三维曲面传输明文密码,保证不被中间人窃听。就是把密码当作平面 X,Y 坐标,投影到三维空间后变成 X,Y,Z 加密传输,服务器端拿到三维坐标,再投影到平面还原密码。中间人没有 nurbs 公式,没办法还原密码。 |
9
imn1 2016-03-18 11:09:56 +08:00 1
?
那在什么时候算 ECC 呢?用户设定密码的时候? 输入的时候如果没有明文对照,“容错”概念是什么? 其实怎么讨论也没用,密码不能容错 因为一旦容错,权责就分不清了 |
10
ctsed 2016-03-18 11:12:39 +08:00 1
我改密码就只改第一个字符,这样岂不是旧密码还能登录
|
11
3dwelcome OP "那在什么时候算 ECC 呢?用户设定密码的时候?", 第一次写数据库前,把明文密码做 ECC 处理,生成 ECC 多项式字段保存在数据库里,然后把明文密码变成哈希密码,存到数据库密码字段里。
ECC 神奇的地方,是修复后,只需要凭借修复字段和模糊错误密码,就能猜出原正确密码,计算出密码 hash 。 举个例子,你 winrar 加入的压缩修复功能后,数据有部分损坏也能自我修复,并不需要保存一个原数据副本的,你只要有原文的哈希值作为对比就可以了。和不用保存明文密码一个意思。 --------------- "我改密码就只改第一个字符,这样岂不是旧密码还能登录" 模糊登录本来就是干这个的,哈哈。 |
12
menc 2016-03-18 13:58:43 +08:00
乖乖地用安全性高的密码吧少年,
以十位密码为例, 30% 为 3 位容错 密码字符取:大小写 52 个 + 数字 10 个 + 特殊字符 32 个(自己去键盘上查一下) = 94 个 则被认为是正确密码的错误密码有 94 ^ 3 * C(10, 3) - 1 = 99670079 个, 近一亿个密码是可以命中的。 |
13
menc 2016-03-18 14:01:46 +08:00 1
建议去学习信息论, QR Code 的信息冗余是充分的,加上 QR Code 的信息量不大,所以修复是简单的。
另外,请让安全工具回归安全的本真,不要想着在这里优化用户体验,一旦有人被通过错误密码成功登录了,根本就是没办法摆脱罪责的事情。 |
14
3dwelcome OP 黑客并不知道用户的密码位数是多少,假设盲目暴力猜测,一位一位的穷举尝试, 93 + 93^93 + 93^93^93 ... 一直尝试到第九位攻击结束,近 5260677251 亿次密码攻击是完全无效的,然后才开始有效攻击。
|
15
menc 2016-03-18 15:05:47 +08:00
@3dwelcome 笑尿,你至少算一下期望好不好,你这是什么计算方法。
你这种奇怪的计算方式,万一用户的密码是 000000^&*呢?本来挺强的密码,用 00000000 直接就登录成功了。尝试实验次数: 1 次 |
16
cnnblike 2016-03-18 15:11:44 +08:00
看了下楼主注册时间,原来如此……
|
17
jedihy 2016-03-23 07:27:23 +08:00
一个很大的问题是,你怎么优化你的数据库去做这样的查询。动辄以此登陆几十上百次查库,你的网站能支持多少人登陆?
|
18
3dwelcome OP @jedihy 你没理解,不需要几百次查库的。用户在全密码匹配登录失败的时候,才会触发系统的纠错,这种情况很少的。而这时候,仅仅只需要一条查询,就可以把单一用户的恢复数据取出来,就一个 blob 小字段而已。
举个不恰当的例子,就是类似正则的密码模糊匹配登录。 |
19
xavierskip 2016-03-23 19:41:47 +08:00 via Android
脑洞太歪了。铜币拿走,不送
|