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

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

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


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

13349 次点击
所在节点    Java
105 条回复
edsgerlin
2016-08-23 10:50:42 +08:00
@kaneyuki 不加盐的话,比如用户用 HelloWorld1984 做密码,这种低熵密码如果没有盐的话直接 lookup 一下别人计算好的 rainbow table 就能知道原文了。如果有加盐的话就要根据已知盐+常见密码重新开始计算,相对来说没那么轻松。
然而 GPU 计算时代算通用 hash function 的 rainbow table 而且覆盖常用密码空间并不是多难的事情,即使每个用户都加上随机盐也只是提高了大规模撞库的难度而已,不能反针对少量用户的 targeted attack 。
真正要让 rainbow table 的生成更困难只能采用计算开销几万倍于通用 hash function 的专用 key derivation function ,比如 bcrypt 、 scrypt 之流。
daemonghost
2016-08-23 11:49:54 +08:00
@reyoung1110 md5 是 hash 算法,也可用于加密,在安全领域 md5 以前用得还是挺多的啊
3dwelcome
2016-08-23 12:13:21 +08:00
@youxiachai 你老师没说错、 md5 也有加密用途、为了消耗 cpu 计算力的循环算法、只是用的少、很多人并不知道罢了。
Clarencep
2016-08-23 12:19:04 +08:00
@edsgerlin 好吧,我把 bcrypt 和 mcrypt 弄混了 囧
cjyang1128
2016-08-23 13:03:07 +08:00
bcrypt 大法好
chaegumi
2016-08-23 13:18:20 +08:00
其实我看还是因为 md5 是内置的,不用安装啥组件这个原因,上古遗留下来的
SlipStupig
2016-08-23 13:33:53 +08:00
@3dwelcome 我可能学的不好,请问既然 md5 可以加密,怎么才能解密出来呢?
SlipStupig
2016-08-23 13:41:57 +08:00
@iyaozhen 现在字典攻击只是一部分,更厉害是 GPU 集群破解, hack 拿一两千台机器的 gpu 去跑,一般的摘要算法几乎扛不住
tairan2006
2016-08-23 13:48:51 +08:00
Asimov
2016-08-23 14:18:51 +08:00
@edsgerlin scrypt 也沒啥用啊,萊特幣礦機多的是,破解他不是分分鐘的事。
mnzlichunyu
2016-08-23 14:50:25 +08:00
一个加密算法应该是默认攻击者知道加密算法,还能保证安全性的。自己随手搞一个加密算法,应该是很难保证这一点;
md5 不是加密算法;
3dwelcome
2016-08-23 14:55:04 +08:00
@SlipStupig 加密又不需要解出来、能防止被暴力破解就可以了啊、你一个 gpu 破一遍 md5 没压力、但是递归几千次几万次呢?把算法复杂到足够强、就如比特币解算的强度、一般黑客还真破不了。

再说 md5 加密又不是谁一拍脑袋想出来的、是 freebsd unix 最初用户系统安全的基础算法。
3dwelcome
2016-08-23 14:57:29 +08:00
Md5 本身是散列算法。但也有 md5 加密算法、已经修改了 md5 一次计算的本质、两者代码差很多、别搞混了。
3dwelcome
2016-08-23 15:03:14 +08:00
那些以为算一次 md5 就是加密的同学可以洗洗睡了、完全不是这样的流程。
SlipStupig
2016-08-23 15:21:12 +08:00
@3dwelcome 加密解密不出来有什么用,我自己随便写一个随机数也算加密算法啰?
3dwelcome
2016-08-23 16:34:38 +08:00
@SlipStupig MD5 没加密,会被黑客有针对性的攻击。而把算法修改后,黑客就没办法轻易攻击了,这流程肯定是叫加密啊。

人家老外从一开始就叫 MD5 加密,要不然谁会跟着叫这个。咬文嚼字就没意思了,你一定说这是 MD5 混淆算法,那我也没办法。
https://www.usenix.org/legacy/events/usenix99/provos/provos_html/node10.html
edsgerlin
2016-08-23 17:26:20 +08:00
@Asimov 一样用了 ASIC 的情况下计算 scrypt 依然比 md5 之流消耗多得多的资源,况且 MD5 这种都不用 ASIC ,直接 GPU 就能算了。防矿机目前推荐 Argon2 ,虽然太新了点。
note286
2016-08-23 17:42:06 +08:00
不要自己创造加密算法, 而且 MD5 也不是加密算法, 因为它不需要密钥, 他是散列函数, 你不是专业的密码学专家, 不要试图去自己编一个算法, 你以为看着不错, 其实专家你看就觉得弱爆了, 好的算法需要经过数学上的测试和时间的检验, 大概就是这样, MD5 长度有点短, 所以彩虹表有点优势, 我们可以使用 SHA-256 啊, 这个是很长的, 而且你不要直接散列啊, 你加盐啊, 用户可能会起 123456 这样的弱密码, 123456 对应的哈希值大家都知道, 但是你可以加盐啊, 这样就没人知道用户的密码是 123456 啊, 你说是吧.
fjzjk
2016-08-23 17:45:04 +08:00
我之前也是这么想的。后来老手说:你可以 md5 加密两次...........
md5 实际上是不算加密的,用他大概只是因为方便而已。
asdwfwqd
2016-08-23 18:01:26 +08:00
好像听谁说过:很多程序员用 md5 的原因是,教科书里面举例子就是用的 md5 ,虽然 md5 不适合用来加密

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

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

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

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

© 2021 V2EX