V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fange01
V2EX  ›  程序员

我理解的密码破解,大家看有问题不

  •  
  •   fange01 · 2014-12-11 21:28:24 +08:00 · 4091 次点击
    这是一个创建于 3639 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网站密码的保存大致经历了 明文——md5——md5(salt)——多重认证。
    明文:顾名思义,就是我们能看懂的密码。比如csdn泄露的600w密码。
    密文:明文经过加密得到的。
    密钥:明文变成密文的函数。
    MD5:常用的摘要算法,理论上是不可逆算法。严格来说不算加密算法,只是摘要,是单向散列。
    salt:简单理解是重复明文+随机字符 md5加密,增加不可逆程度。
    暴力破解md5:md5算法不可逆,但是可以把已知明文批量生成散列,然后用别人的md5密文跟生成散列碰撞,散列一样的明文一样。
    彩虹表:这玩意比较抽象,打个比方,md5散列是一把锁,暴力破解是做了能开这把锁的所有钥匙,然后挨个试哪个能开。而彩虹表是把差不多的钥匙(至少能插进锁的那些)分组,然后再从分组里面分组,减少插钥匙时间,提高效率。
    关于彩虹表 知乎的回答不错: http://www.zhihu.com/question/19790488

    有些奇葩网站泄露的密码是明文的,不需要破解。
    大部分是md5认证的,各种破解软件、网站、彩虹表的诞生,md5几乎等同明文。
    部分是有salt的,比如dz论坛默认是md5(md5($pass).$salt),拖库时基本md5和salt以及算法都泄露了。解密只是时间问题。
    其他加密方式,在常用密码明文大量泄露环境下,任何加密方式都显得鸡肋。

    比较好的解决方案可以多重认证,比如广泛使用的 密码登陆的同时需要手机验证码。
    7 条回复    2014-12-12 10:35:43 +08:00
    txlty
        1
    txlty  
       2014-12-11 21:35:00 +08:00
    明文——md5 不是先后出现,而是并行出现。互联网普及之前,md5就发明出来了。
    2003年主流的建站程序都已经采用了md5。而今天,还有很多新开发的网站明文储存密码。
    CoX
        2
    CoX  
       2014-12-11 22:05:57 +08:00
    PHP用Password Hashing 函数, Python用bcrypt库
    应该是一个比较好的解决方案
    bellchu
        3
    bellchu  
       2014-12-11 22:13:48 +08:00
    多重密码是现在比较好的保密措施,05年开始用RSA的Token Ring,虽然是混合加密的老大,但是每天带这个钥匙环一样的东西实在麻烦,还不能忘记带。后来出了手机上的RSA的APP,稍微方便一点,但是时间服务器配对也很烦。

    现在给公司用的DUO双重验证,效率很高,三种方式拿密钥,楼主说的手机验证码就是其中一种,也可以语音验证,App验证。

    感兴趣的可以看看 https://www.duosecurity.com/
    ChanneW
        4
    ChanneW  
       2014-12-11 22:17:23 +08:00
    多重认证 麻烦啊
    whywhywhy
        5
    whywhywhy  
       2014-12-11 22:44:20 +08:00
    如果算法和密文都暴露,那破解真的只是时间问题,特别是有钱或者有权利的时候,这个时间会大大缩短

    所以最重要的是,不要被获得密文,或者不要被获得算法,你可以在MD5的基础上修改它的算法,甚至存储的时候依然叫MD5,让破解者依旧用md5的方式去寻找原文(说是原文也不对,算是彩虹表中一条对应的记录吧),很显然就算他找到“原文”,也依然不会通过验证,因为你的算法根本不是MD5。

    只要你在程序里限制了验证的频率又不同时暴露密文和算法,这样基本上就安全了。

    嗯 最后还要排除掉传输的时候不要使用明文的方式……比如可以采用签名的方式
    zhicheng
        6
    zhicheng  
       2014-12-11 22:50:31 +08:00
    用 PBKDF2 吧,对于非密码专业人士,最好不要自己相当然的 roll 一套机制。
    多重认证也不一定安全,尤其是在密码已经泄露的时候。
    GSM 短信是明文可以监听的。
    二阶段认证很多人的使用是不合理的,在上一家公司做顾问的时候,review 他们的代码,他们就犯了典型的错误,在取消二次认证的时候,需要认证,但是在设置的时候不需要,如果我拿到密码,直接用 curl 提交一个新的key到他们的设置二次认证的接口上就可以了。告诉他们工程师是完全不理你的。
    另外,任何加密手段,暴力破解都是有效的,除了一次一密密码本。

    可以提几点来简单增加安全性,
    在传输密码的接口上用 HTTPS ,最好带绿条的。
    在登录接口加 rate limit ,不要只限制 IP ,要限制 ID 。
    Session ID 不要用自增 int 。
    服务器时间尽量准确。
    生成密码摘要的 salt 要每个都不一样,如果自己 roll 的话。

    进阶的可以,
    敏感数据分库分权限存储,密码,信用卡号码等。
    买套代理服务器IP库,限制代理访问。
    上 WAF 。
    mybin
        7
    mybin  
       2014-12-12 10:35:43 +08:00
    严格的来讲password应该叫做口令吧,对于口令来讲定期更换能解决一些问题,如果再结合动态口令的话会更好一些。
    MD5碰撞是针对数字签名的,虽然能碰撞但不能形成有意义的碰撞,对数字签名来讲目前还没有实质性的影响。
    用MD5
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:52 · PVG 10:52 · LAX 18:52 · JFK 21:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.