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

哎,每次去Stackoverflow回答问题都会被Down Vote很惨,伤心

  •  
  •   raincious · 2013-11-23 21:54:27 +08:00 · 5204 次点击
    这是一个创建于 4019 天前的主题,其中的信息可能已经有所发展或是发生改变。
    上次是那个isset是不是必要的问题,这次是密码salt的。

    http://stackoverflow.com/a/20162215/2328799

    不过这次貌似学到了 *大家都* (指重视安全的小伙伴们?) 都不建议使用MD5做密码加密。

    当然,其实我已经知道这些了,但是MD5实在是太快了(就是喜欢这一点嗯),而且我有一些经常会调用到的验证函数(比如用在会话KEY合法性上的),为了避免冲撞(相对于更快但更容易撞上的CRC32)也还是用到了MD5。

    于是为了更安全的用到MD5并确保不会逆算,我自己也写了套函数来摧毁原先的MD5串(的一部分嗯,这貌似也犯了大忌,叫:不要自己写加密算法)来保证源字串非常非常非常难破解出。

    不过貌似SO上大家都不买这一套嗯。




    PS: 上次那个问题之后,我就写了套新的框架,虽然代码还在慢慢改进和去BUG化,或许也犯了一些大忌,但是已经大量避免了undefined的问题。

    而且,新框架 *虽然* 会强制使用 error_reporting(E_ALL &~ (E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_PARSE | E_ERROR | E_WARNING | E_DEPRECATED | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_DEPRECATED | E_USER_NOTICE));
    这么长的设置来关掉错误回显(前面几个CORE和部分COMPILE以及PARSE我根本干预不到啊) // 接下去看啊亲。

    但是由于之前注册了set_error_handler(array(&$this, 'errorHandler'), E_ALL);,错误一个都跑不掉而且还能手动report到Sentry和文本日志里嗯(这样就不怕多个网站混了(懒得设置服务器.htaccess和.conf的路过)),比PHP自己的日志好很多啊。

    https://github.com/raincious/facula/blob/master/core/core.debug.php#L95

    还是得感谢 @ShiningRay @python @AlloVince @chenz 的重拍嗯。

    // 另外这个也请大家重拍嗯……
    第 1 条附言  ·  2013-11-23 23:34:09 +08:00
    其实我主要是想知道我这样写MD5 Hash模块有没有什么问题嗯。

    求教:
    https://github.com/raincious/facula/blob/master/libraries/tools/class.hash.php#L49
    第 2 条附言  ·  2013-11-24 05:23:18 +08:00
    修正下嗯,我翻到了之前做写这个模块之前的笔记。

    上面写着:

    混淆方式的目的是在主密钥安全的前提下让密码难以逆向算出……或当密钥被窃时,安全性降低为HASH(HASH(PASSWD + AUTHKEY))。看来是我记错了嗯。

    当Salt被偷之后,安全性会下降。因为已经可以用相同算法直接用穷举算出了。

    当Salt被偷之前,比如有些时候将PASSWD或者需要验证的加密码存在COOKIE里发给客户然后发回来做验证的时候。

    这时候为了破解,必须逆向算法,走完反向HASH1之后,由于就算按照常规算法去死算也不到Salt,而需要猜测插入的Salt的具体位置和内容,于是。这样就很难破解了。
    22 条回复    1970-01-01 08:00:00 +08:00
    est
        1
    est  
       2013-11-23 22:37:03 +08:00
    第一句话就说错了吧。salt直接随机生成明文保存啊。。。
    raincious
        2
    raincious  
    OP
       2013-11-23 22:39:07 +08:00
    @est 嗯?但是我说了unless呢……不会是因为英语太烂了导致理解错误了吧。那就太冤枉了。
    rannnn
        3
    rannnn  
       2013-11-23 22:45:41 +08:00
    抱歉没能看懂。第一句话你想表达什么。。。
    raincious
        4
    raincious  
    OP
       2013-11-23 23:05:38 +08:00
    @rannnn 修改了呢。

    我想说的是,随机的Salt,如果不存下来,未来是不能比较Hash的。
    rannnn
        5
    rannnn  
       2013-11-23 23:17:28 +08:00
    @raincious 把salt存下来并不意味着不安全。第一句话别人看到就直接neg了。请看底下那个人给你的链接
    raincious
        6
    raincious  
    OP
       2013-11-23 23:20:26 +08:00
    @rannnn 但是这样的话,Salt有了,密码穷举下也就能出来了啊。
    rannnn
        7
    rannnn  
       2013-11-23 23:22:53 +08:00   ❤️ 1
    @raincious 加salt的意义不是防止被穷举,是为了防止被直接查rainbow table。你在这一点上理解错误了导致别人neg你而不是因为你用md5
    raincious
        8
    raincious  
    OP
       2013-11-23 23:27:10 +08:00
    @rannnn 我之前也说了salt的意义在rainbow table上,这导致了第一个down vote。意思就是说连MD5都不应该用,因为不安全。

    我觉得以后得更加严谨的说话了。
    ini
        9
    ini  
       2013-11-23 23:30:27 +08:00   ❤️ 1
    MD5不是用来加密的吧,MD5是用来做校验的。。
    raincious
        10
    raincious  
    OP
       2013-11-23 23:44:30 +08:00
    @ini 目前来看是这样。但是它快啊。如果我用更慢的算法,可能代价来看不合适。这也是为什么我一直在用MD5来做这些。

    密码其实我用的是SHA1嗯。

    我想可能是这样的:


    我的算法:

    用同一套算法穷举可逆算,用到MD5,然后让MD5慢一点(至少16倍吧,取决于Salt中的字符,正常情况是(16 * 3) + (15 * 2)倍,因为替换了原始MD5嘛,但是MD5不能“变得更慢”,会随着计算能力而更容易算出)。



    PHP自己的password_hash算法:

    拿到Salt之后穷举可逆算,用到Bcrypt,自己就比较慢。



    而且两套方案,一套非主流,另一条是官方的。我觉得大多数人还是倾向于官方嗯。
    9hills
        11
    9hills  
       2013-11-24 00:16:15 +08:00
    @raincious 你的网站是什么规模呢
    raincious
        12
    raincious  
    OP
       2013-11-24 05:30:41 +08:00
    @9hills 嗯?

    难道楼上发现弱点了么?请告知下,谢谢。
    bombless
        13
    bombless  
       2013-11-24 07:09:56 +08:00
    wordpress现在那套感觉还是很不错的……
    反正被那阵势吓到了,都没想过再去跑彩虹表,哈哈。
    9hills
        14
    9hills  
       2013-11-24 11:35:38 +08:00
    @raincious 你可以计算下md5和Bcrypt 的CPU时间差距

    以及1w ip的站点每天应该有多少登录动作,以及使用bcrypt比md5来说多使用的CPU时间
    9hills
        15
    9hills  
       2013-11-24 12:16:41 +08:00   ❤️ 2
    @raincious

    1w IP的站也算是大站了,假设这个站的所有页面都需要登陆(也就是没有匿名用户),Cookie保留1周

    也就是每天平均会有 1500个登陆动作,md5一次的时间可以认为是0(ms级别),bcrypt按照0.3s计算

    也就是用了bcrypt后,每天多耗费450s,而且是均匀分布的

    这点时间成本有节省的必要么。。。


    另外MD5就算加salt也不安全,尤其是salt泄漏后,跑个单独的彩虹表是很快的,上1G/s的速度(如果是针对个别用户,用暴破也非常快)

    bcrypt是安全和速度的balance,跑彩虹表,跑死吧,一个0.x s <_<
    raincious
        16
    raincious  
    OP
       2013-11-24 12:26:04 +08:00
    @9hills 谢谢建议。

    我现在的打算是,拿MD5当验证用的Key好了,密码什么的至少用SHA256或者SHA512来存。

    这样就可以:

    1、使用MD5来进行频繁的操作,比如产生临时Key以及这些Key的验证之类,不会太多影响性能。

    2、使用更复杂的算法来进行密码加密。这些操作只需要在登录时和设定密码时进行,所以耗时一点也没关系,而且已经改成循环执行N次的来取得Hash的了。貌似这样就更安全了嗯,SHA512混着沙默认算1000次,应该够了吧。

    Bcrypt还是等有机器的时候再测试吧,现在最多也只能拿到旧i7什么的,结果不明显嗯。

    * 代码已更新
    raincious
        17
    raincious  
    OP
       2013-11-24 12:32:06 +08:00
    @9hills 不嗯。新架构上没有开发站点,因为架构还是在草稿的状态,只有我自己的网站在用,而网站也还在开发中,于是经常改改没问题。(而且挪窝了,换了轻松的地方,养活自己就可以,然后准备自己搞站,不给别人打工了。)

    然后其实目前正好遇到了这个问题。因为新架构没有会话系统,正在实现,而会话这边需要有Hash方面的操作。所以我就算是找骂讨答案呗。

    刚才看了下Bcrypt和MD5比较的相关文章。Bcrypt比MD5好几百个数量级是肯定的嗯。。。但我不确定真要写在Hash里,或许专门写个Passwording的比较好。
    9hills
        18
    9hills  
       2013-11-24 12:36:49 +08:00   ❤️ 1
    @raincious 就放弃hash搞密码吧,本身就不是为了密码设计的,因为性能太好了<_<

    密码的算法关键是慢,快了反而不安全。Bcrypt的复杂度是能调整的,就是要慢到计算机无法忍受而人类可以忍受的地步,比如0.x s
    luikore
        19
    luikore  
       2013-11-24 20:31:02 +08:00
    bcrypt 可以把速度调快的啊, 例如接近 MD5 的速度. 就算是低复杂度的 bcrypt 还是比 hash 有优势: 相同输入多次运行的出来结果也是不同的.
    luikore
        20
    luikore  
       2013-11-24 20:34:53 +08:00
    bcrypt 这么方便, 还不用自己搞 salt, 为什么还要造轮子...
    跟楼主说改用 scrypt + pbkdf2 是不是有点困难...
    raincious
        21
    raincious  
    OP
       2013-11-24 22:37:37 +08:00
    @luikore

    但,重复造轮子还是挺有意思的啊。

    我不会告诉你我同时还在重复造SMTP操作其以及SESSION管理器的轮子嗯……目前正研究SMTP协议,SESSION管理器也有雏形了(但是由于安全原因以及代码实际写的很烂只在自己在开发的网站上测试嗯)。

    Bcrypt等我做好这些在研究呗。
    ShiningRay
        22
    ShiningRay  
       2013-11-26 16:21:19 +08:00
    好像这里没我啥事吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 20:46 · PVG 04:46 · LAX 12:46 · JFK 15:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.