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

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

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


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

12104 次点击
所在节点    Java
105 条回复
reyoung1110
2016-08-22 14:46:22 +08:00
md5 不是加密算法,是 hash 算法。
raincious
2016-08-22 14:47:48 +08:00
qiayue
2016-08-22 14:49:05 +08:00
在没有彩虹表,计算能力不强的年代,一个 md5 加密的确可以解决问题。
后来随着计算能力的提升,人们把常见的字符组合都拿去 md5 跑一遍,生成彩虹表,简单的 md5 就没有用了。
所以一般都需要加盐,并且每个用户的盐都不同。这样即使别人直接拿到了你的数据库数据,他也没办法根据彩虹表知道用户密码是啥了。
jimzhong
2016-08-22 14:49:13 +08:00
md5 不属于加密,因为散列函数的“值域”一定比它的“定义域”小,所以理论上是不可逆的。
但是因为有彩虹表这个东西,单纯用 MD5 已经不安全了,所以一般都会加盐处理。楼主可以看一下 PBKDF 函数的设计。
jugelizi
2016-08-22 14:51:52 +08:00
因为很多程序员只会 md5
不过新手能思考这些真不错了
遇到七八年开发经验的都认为 md5 是来加密的
jasonyang9
2016-08-22 14:55:59 +08:00
参考 Linux 中 shadow 的存放,都是加了随机盐的
binbinyouliiii
2016-08-22 14:57:16 +08:00
@qiayue
@jimzhong
像 cmd5 这种网站是骗人的还是真的可以破解,破解是靠彩虹表,还是它们真的计算能力强大,能够把密码算出来,我看很多人用了这类网站一段时间后可以破解出来(虽然收费)
otakustay
2016-08-22 14:59:00 +08:00
首先,你要有“随手创个加密方式”的能力,我大学自学密码学一年多还是创造不出可靠的算法,怎么就随手了……
gdtv
2016-08-22 14:59:57 +08:00
因为 md5 加密方式很完善,你自己创一个新的加密方式可能有漏洞。
因为有彩虹表,所以 md5 加密的时候必须要加盐,加盐后的安全性强于你自己创一个新的加密方式。
以前 wuyu 上面有篇文章详细解释了为什么不应该自己创建加密函数,可惜那个网站……
murmur
2016-08-22 15:00:21 +08:00
@binbinyouliiii 等你到了企业里就知道了 用简单密码的大有人在 很多系统密码都有个默认的 123456 什么 然后因为开发测试我们会借其他人的正式账户用
不改密码用 123456 的大有人在
jimzhong
2016-08-22 15:01:59 +08:00
@binbinyouliiii 我估计是用彩虹表,但是它的彩虹表规模会很大,以至于要收费。如果要验证用户密码还是推荐 PBKDF 。
ostholz
2016-08-22 15:02:01 +08:00
加密密码段, 一般用 bcrypt 比较好. MD5 的算法已经被优化到极至了, 彩虹码加暴力破解很可能很快就算出.
bcrypt 算一个密码的时候是固定的, 暴力破解对它起不了作用.
jarlyyn
2016-08-22 15:03:38 +08:00
salt 再加 salt
binbinyouliiii
2016-08-22 15:06:30 +08:00
@otakustay 我也不了解算法什么的,我之前认为如果对原文做一些操作,比如原文第 2 个字符加一什么的,一般不知道的人也没法破解,算法有漏洞啥的更是不了解,原谅我小白
ma125125t
2016-08-22 15:08:34 +08:00
@jarlyyn 要是这样为何不直接用加密算法呢
jimzhong
2016-08-22 15:08:56 +08:00
@binbinyouliiii 如果感兴趣可以阅读一下 William Stallings 的《密码编码学与网络安全》。
jimzhong
2016-08-22 15:10:05 +08:00
@ma125125t 如果拖库加密密钥也很可能被对方知道。
jarlyyn
2016-08-22 15:12:21 +08:00
@ma125125t

md5 并不是加密,还是取特征值。

加 salt 是为了让原始密码混淆,不容易被识别。
xcodeghost
2016-08-22 15:15:52 +08:00
很多私人创建的加密算法,其实并不如一些主流的加密算法来得可靠。毕竟主流的加密算法在全球大范围的使用,如果有漏洞应该很快就会被发现了。自己创建的加密算法,除非很完美,否则不建议使用。
loading
2016-08-22 15:19:56 +08:00
加盐,也就是你在用户的密码后面附加一个一定长度的字符串,有全网用同一个的,还有就是随机生成(记得一起存到数据库)每一个都不同。

然后对这个合成的密码进行 md5,一般会使用多次 md5 的方式,防止被彩虹表命中,或者被人撞库(应该没人会这样验证)


你用 md5 生成的,是没法算出原文的。

除非彩虹表。就是一个保存有原文和对应 md5 的表格,从里面查出来。而这个原文字符串也并不是机器穷苦出来的,而是从像 csdn 前期泄漏出的使用明文保存密码里面生成出来的,很多人的密码要么和 csdn 一样,要么就碰巧 csdn 这些库里就有一样的。就像 123456 这个密码,你会用,别人也会用。

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

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

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

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

© 2021 V2EX