关于 md5 密码加密的一点小疑问

2016-08-22 14:43:50 +08:00
 binbinyouliiii

    现在很多公司都用 md5 加密来加密密码,我们公司也是用的这个方式(不是我写的),众所周知, md5 是不可逆的,所以存在数据库的密码是加密的,如果用户从前台传来密码,按照我现在所知的应该只能从传来的密码再加密后和数据库进行比较。
    前几天又看到有一个叫彩虹表的东西,觉得跟字典差不多,那这样岂不是很不安全,既然 md5 不可逆,那为什么公司都不自己随便创个加密方式,非要用 md5 ,有了彩虹表这个东西, md5 又比普通的加密安全吗?


刚实习的新手,有小白的地方轻喷😃

12140 次点击
所在节点    Java
105 条回复
loading
2016-08-22 15:23:18 +08:00
别人黑掉你的服务器,你的加密算法也就到手,拿到你的加密算法密钥也是分分钟的事,所以使用加密算法不见得比 md5 好。

对用户密码加密,很多时候是为了保护用户的密码,而不是保护用户在你服务器的内容!
ma125125t
2016-08-22 15:23:24 +08:00
@jarlyyn 明白,使用 md5 或加盐的时候已经表明使用者不需要原文的任何信息,但希望结果是唯一值,是这个意思吧。
sheep3
2016-08-22 15:23:28 +08:00
密码所在表添加一个字段 salt ,在登陆时通过用户名拿到 salt 再和传上来的密码进行拼接后求 MD5 ,再和数据库的 MD5 值比较.
eliteYang
2016-08-22 15:23:53 +08:00
加一个随机 salt
jarlyyn
2016-08-22 15:28:46 +08:00
@ma125125t

结果也不是唯一值。

而是碰撞的概率足够小。
ma125125t
2016-08-22 15:47:14 +08:00
@jarlyyn 还有一个问题,没拿到盐的情况下,有办法获取加过盐的密码的散列值的原文吗?如果没办法,是否没必要加两次盐呢,或者说加两次盐的目的是防止第一个盐被获取的情况下进行再保护呢。不过盐又怎么会拿到呢,一般盐放在数据库中,拿到盐的时候已经拿到密码了吧?不知道我的理解有没有问题。
imlonghao673
2016-08-22 15:52:56 +08:00
md5 的解密成本就是 cmd5 的价格
lincanbin
2016-08-22 15:53:26 +08:00
要发明一个 Hash 算法,你得先去证明它是 Hash 算法。
Felldeadbird
2016-08-22 15:59:11 +08:00
自己写的加密算法有一个可怕的地方在于,网站得漏洞让加密代码爆出的可能性。
想想就觉得可怕了。你在某网站得密码,可以解密出来的……
MD5 即使结合彩虹表,也不表示所有密码是由对应的。所以其实加点盐, MD5 目前足够使用的了。
jarlyyn
2016-08-22 16:06:30 +08:00
@ma125125t

盐和密码(特征码)是放在一起的。加盐就是为了数据库被拖库的情况下保证安全。

一次加盐和两次加盐的安全性差不多。

我只是为了以后可以本地存 hash 代替密码
xi2008wang
2016-08-22 16:16:19 +08:00
转乌云的一篇很赞文章
https://jiji262.github.io/wooyun_articles/drops/%E5%8A%A0%E7%9B%90hash%E4%BF%9D%E5%AD%98%E5%AF%86%E7%A0%81%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E5%BC%8F.html

核心观点:
1 ,不要自创 hash 算法
2 ,加盐,而且盐长度足够,至少要和 hash 输出一样长
3 ,不要重复使用盐
lance6716
2016-08-22 16:19:38 +08:00
科班出身是多么重要…
damean
2016-08-22 16:39:10 +08:00
额,好多人似乎没有学过密码学。。。

最后不建议自造算法,建议多看看书。
qinxi
2016-08-22 16:40:19 +08:00
加盐,以及 hash 次数
shiny
2016-08-22 16:43:41 +08:00
加盐;加随机盐
Kantoi
2016-08-22 16:44:55 +08:00
@xi2008wang 看的好爽
jhdxr
2016-08-22 18:21:40 +08:00
@binbinyouliiii 你“加密”(加引号,因为正确的说法是哈希)的意义在于把你的代码 /算法和数据都交给别人的情况下,别人依然无法轻易获得你用户的密码。为什么要把代码和数据给别人?因为你有信心永远不被黑么。。。


然后再来说一些上面已经有人提到的内容。彩虹表的原理是什么?因为 md5 的结果是确定的,也就是说对于 A 输入,它得出的结果一定是 A',那么我就可以预先计算好。这样子当你给我一个 md5 的结果时,我就能反向找出它对应的明文是什么。而且在实际上,很多人用的密码都很常见,所以很容易就被找到了(也就是破解了)

然后就有了加盐的概念,既然用户自己的密码很容易被破解,那么我就在用户的密码上增加点什么。考虑到彩虹表的原理是预先算好,所以应对的方法很简单,我使用户的密码变得很长(例如在最后加上个 32 位字符串)。← 这也是为什么你提出的『用户密码第二位+1 』这种方案没有意义,在知道你的算法后,别人的计算量并没有提高

然后之所以不要重复用盐, 是因为如果你对于所有用户的盐值都一样,那么入侵者就可以针对你的盐值,专门打造一份彩虹表来进行破解。而如果每个用户的盐值都不一样,那么他破解的代价将高很多很多( 不存在绝对安全的算法,我们能做的就是在自己能够承受的情况下,尽可能提高入侵者的成本)

最后说下换算法以及加 hash 次数。 md5 之所以以前没问题,现在不行了的原因是计算力的不断提高。所以首先增加 hash 的次数这种做法是有意义的,因为它会增加彩虹表生成的时间。然而这种意义不大。。。因为计算力依然在继续提高。。。但这个思路是完全正确的,例如 bcrypt 或者 pbkdf2 都是这种思路。假如每次函数调用增加到半秒,对于正常的业务来说影响不大(只需要在登录时验证),但对于彩虹表来说,哪怕只计算 8 位的纯数字就需要 10,000,000*.5/86400=57.87 天了。别觉得这个时间好像很短,因为这只是 8 位纯数字,换成 8 位的数字+大小写字母就是 62^8*0.5/86400/365=3461759 年了。。。而且配合上面说的不要重复用盐,对于每个用户都重新计算彩虹表,这个代价就更加的大了。。。
Halry
2016-08-22 18:27:07 +08:00
md5 什么时候是加密的
觉得至少也要 sha1 吧
wy315700
2016-08-22 18:27:59 +08:00
@Halry sha 几都不是加密的
youxiachai
2016-08-22 18:29:11 +08:00
@lance6716 科班也没啥用吧..你读大学的时候有教这个...起码我大学老师..也是把 md5 管加密..我去吐槽他的时候.还不鸟我..

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

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

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

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

© 2021 V2EX