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

2013-11-23 21:54:27 +08:00
 raincious
上次是那个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 的重拍嗯。

// 另外这个也请大家重拍嗯……
5198 次点击
所在节点    PHP
22 条回复
est
2013-11-23 22:37:03 +08:00
第一句话就说错了吧。salt直接随机生成明文保存啊。。。
raincious
2013-11-23 22:39:07 +08:00
@est 嗯?但是我说了unless呢……不会是因为英语太烂了导致理解错误了吧。那就太冤枉了。
rannnn
2013-11-23 22:45:41 +08:00
抱歉没能看懂。第一句话你想表达什么。。。
raincious
2013-11-23 23:05:38 +08:00
@rannnn 修改了呢。

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

我觉得以后得更加严谨的说话了。
ini
2013-11-23 23:30:27 +08:00
MD5不是用来加密的吧,MD5是用来做校验的。。
raincious
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
2013-11-24 00:16:15 +08:00
@raincious 你的网站是什么规模呢
raincious
2013-11-24 05:30:41 +08:00
@9hills 嗯?

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

以及1w ip的站点每天应该有多少登录动作,以及使用bcrypt比md5来说多使用的CPU时间
9hills
2013-11-24 12:16:41 +08:00
@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
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
2013-11-24 12:32:06 +08:00
@9hills 不嗯。新架构上没有开发站点,因为架构还是在草稿的状态,只有我自己的网站在用,而网站也还在开发中,于是经常改改没问题。(而且挪窝了,换了轻松的地方,养活自己就可以,然后准备自己搞站,不给别人打工了。)

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

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

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

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

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

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

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

© 2021 V2EX