mysql 能否一句 sql 验证加盐的密码?

2015-05-27 09:40:35 +08:00
 jookr

mysql能否一句sql验证加盐的密码?

table
uid username password salt
1 admin ce7ba70a8a7bdf9b6cc10beeff2b3e03 qwe123

正常流程需要三步
表单提交的用户名$username和 密码$psw

步骤1先查出盐$salt
select salt from table where username = '$username'
步骤2然后加密
$password = md5($psw.$salt);
步骤3最后再查是否有符合条件的数据
select * from table where username='' and password='$password'
有结果就说明密码正确
没结果就说明密码错误或者没这个用户名的账号

请问以上三步能否用mysql的子查询或者什么高级方法一句话就能验证结果呢?

谢谢

8303 次点击
所在节点    MySQL
78 条回复
jsq2627
2015-05-27 15:24:25 +08:00
@dallaslu 上面只讨论了攻击者没有取得代码的情况。遇到这种私有的复杂哈希函数的话,攻击者会想办法取得代码的。

我觉得正确的思路应该是 PBKDF2 那样,大大增加计算彩虹表的时间成本。即使有了代码也没法破解。
wy315700
2015-05-27 15:25:11 +08:00
@jsq2627 其实吧,现在的TLS都是形同虚设,以前好像有过调查,排名前1000的APP,大多没有正确使用TLS,也就是说,大部分APP里的TLS都没有校验证书正确性,,,,
jsq2627
2015-05-27 15:30:33 +08:00
@wy315700 那也不能怪 TLS 喽,明明是大家的使用姿势不正确~

不过我以前也干过这样的事,客户端配置 TLS 的时候不验证服务器证书,以为这样就能省张 SSL 证书的钱了~ 正确的省钱姿势是安装自己的根证书。
wy315700
2015-05-27 15:33:15 +08:00
@jsq2627 其实不单单是省证书钱,我们现在用了TLS以后发现个问题,客户端如果时间不对,比如手机的时间跑到了证书生效之前,然后就连不上了。。。。。
jsq2627
2015-05-27 15:37:00 +08:00
@wy315700 哈哈哈客户真奇葩。
leyle
2015-05-27 17:20:51 +08:00
安全分为不同的阶段,比如传输阶段的数据安全;获取了数据库内容后,暴力破解还原原始密码的密码破解安全,是两个不同的概念。

前面使用 https 的来传输数据,后面使用上面大家的讨论方法来将暴力破解的成本尽可能的提高,让 cracker 的投入产出比差距太大,他自己都会放弃了。
picasso250
2015-05-27 18:32:13 +08:00
PHP有专门的(一个)函数来做这个事情。
maja
2015-05-27 18:37:28 +08:00
扯那么多没用,三句话总结:

Use the fucking bcrypt! Use the fucking bcrypt! Use the fucking bcrypt!
armoni
2015-05-27 21:09:38 +08:00
@benjiam 你hash密码的目的不就是加密不让人看到真实密码吗,
benjiam
2015-05-27 23:21:20 +08:00
太沉重的加密算法会被cc攻击 。 https可以解决所有问题,HTTP的话,hash最大问题是彩虹表,万一被脱裤了,和裸奔没啥两样,所以要加盐。还有一种解决办法,多次hash迭代。比如md5 20次。其实没啥鸟用,最多让攻击者没办法利用现有彩虹表。加盐的hash最大问题是没办法让客户端提前拿到自己的盐,比如Web端。HTTP另一个比较大的问题是被监听抓包,拿到session,但是可以把权限控制分层。普通权限用一个权限,别的用一个权限。类似支付宝支付密码,但是其实没个卵用。还是HTTPS吧 。这个才是活好
gkiwi
2015-05-28 02:08:15 +08:00
为了各种大家也是够拼了,大家可以参考微软的kerberos机制,保准恶心到出血,但是有个卵用啊。。
看看人家支付宝的登陆,各种加密手段都上了。你自己得有那个时间啊。
密码安全这块,很多时候根本用不了那么复杂的机制。HTTPS+盐就够用了。。
Daniel65536
2015-05-28 07:41:06 +08:00
@benjiam 你以为md5 20次迭代就没法用现成彩虹表了毕竟还是图样。

彩虹表是这么做的:
1.选定一个初始值x
2.连续md5 k次
3.保留结果y

破解时连续md5 k次,检查过程中是否出现过y,不管你迭代了几次,只要次数小于k就能用原来的彩虹表。

这手法是彩虹表的时间换空间,另外有些彩虹表还会不断用函数把md5值映射回一般的a-Z0-9字符串,也有奇效。
benjiam
2015-05-29 09:25:57 +08:00
@Daniel65536 很简单的办法 每次md5 结果加在前一次结果里 继续迭代,你的彩虹表还能继续用吗?
benjiam
2015-05-29 09:29:13 +08:00
@Daniel65536只要每次修改每次迭代算法就可以,20次 10次md5 10次sha1 你的虹表可以破解吗?
Daniel65536
2015-05-29 14:12:07 +08:00
@benjiam 你首先得知道彩虹表是怎么产生的,才提得出来这个很“简单”的办法,想出这个很简单的办法仅仅值一毛钱啊。于是你用刚刚得到的新的信息又拍了一次脑门,可是讨论安全问题真不能随便拍脑门的。
benjiam
2015-05-29 15:01:11 +08:00
@Daniel65536 讨论安全问题的前提 是成本, 你有现成的虹表可以利用,我只是让你将成本提高,重建一个虹表。 这个方案本来就不是完全安全的。
McContax
2020-05-25 15:46:40 +08:00
@stiekel 2020 来挖 2015 的贴貌似不太道德,针对第一点我想问为什么不用 https ?另外二次 MD5 安全性并没有上涨很多,之前在廖雪峰的博客看过类似的文章,另外哈希加盐也不用 md5 哈希了,安全性挺低的,业余用来验证唯一性还过得去
stiekel
2020-05-25 19:00:34 +08:00
@McContax 我并没有排除使用 https 。
hash 可以不用取全部。
比如,第一次的结果,可以从中挑选一部分,再第二次取 hash 。

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

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

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

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

© 2021 V2EX