V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
3dwelcome
V2EX  ›  问与答

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

  •  
  •   3dwelcome · 2016-03-18 10:03:01 +08:00 · 3136 次点击
    这是一个创建于 2933 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    举个不恰当的例子,就是类似正则的密码模糊匹配登录。
    xavierskip
        19
    xavierskip  
       2016-03-23 19:41:47 +08:00 via Android
    脑洞太歪了。铜币拿走,不送
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3758 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:22 · PVG 18:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.