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的子查询或者什么高级方法一句话就能验证结果呢?

谢谢

8046 次点击
所在节点    MySQL
78 条回复
dallaslu
2015-05-27 10:48:26 +08:00
@stiekel
@xenme
@BOYPT 不如直接用 https 处理登录请求,安全方便。
dallaslu
2015-05-27 11:06:40 +08:00
引用楼主:
正常流程需要三步
表单提交的用户名$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'
有结果就说明密码正确
没结果就说明密码错误或者没这个用户名的账号

这里的描述有逻辑漏洞:

* 如果步骤 1 没有查到盐,就说明用户号不存在;
* 如果步骤 1 中查到盐,步骤 3 没有结果则只可能是密码错误;

不如把加密过程留在脚本里做:

1. 先一次查询出盐和密码:
select salt, password from table where username = '$username'

2. 再加密对比:
$result = ($password == md5($psw.$salt) ? 'success' : 'failed');

这样,加密方式有很多种选择。比如:

sha1( password + sha1( salt ) )
wy315700
2015-05-27 11:14:14 +08:00
@dallaslu 不要直接拼接hash,请使用业界标准hmac
@jiongjionger
yanze0613
2015-05-27 11:14:40 +08:00
加密解密用程序来解决,数据库存放加密结果和盐
dallaslu
2015-05-27 11:26:10 +08:00
@wy315700 本贴中的数据库存放盐和 hash 值的做法是传统 B/S 验证的典型方案。hmac 需要客户端自行实现加密方法吧?
wy315700
2015-05-27 12:00:05 +08:00
@dallaslu 计算hash的时候用hmac,不要拼接,和客户端无关
hgc81538
2015-05-27 12:06:51 +08:00
hash 函数不是用來储存密码的

如何安全地存储密码?
http://blog.jobbole.com/87058/

phpass
http://www.openwall.com/phpass/
benjiam
2015-05-27 12:10:24 +08:00
@armoni hash 和加密是2回事,不要误导新人

hmac 的问题 是用户怎么拿到自己的私钥key
wy315700
2015-05-27 12:27:25 +08:00
@hgc81538 bcrypt不错,但是这样的话,登录的接口要加防护,不然很容易被攻击。
s51431980
2015-05-27 12:29:45 +08:00
楼下诸位纷纷教楼主怎么加(zuo)密(ren)。

直接回到楼主问题,一行代码貌似也能解决问题,如 http://sqlfiddle.com/#!9/6188c/10
zhicheng
2015-05-27 12:40:00 +08:00
请问楼主和楼们上你们知道有个东西叫 PBKDF2 吗?
dallaslu
2015-05-27 12:45:58 +08:00
@zhicheng 又学到了新名词。楼主的问题是解决简便验证盐、hash,至于怎么加密,则又够开一帖讨论的了。
zhicheng
2015-05-27 12:48:29 +08:00
@dallaslu 有兴趣我可以跟你们讨论一下。。。
dallaslu
2015-05-27 12:51:40 +08:00
@wy315700 我理解的 hmac ,是用一定的 hash 算法和随机数,解决了密钥在客户端和服务端传输的风险问题。自然要求客户端实现加密算法啊。

如果只在 B/S 架构的 Server 端应用 hmac 来验证用户提交的密码是否与数据库中一致,hmac 的客户端和服务端角色都由 Server Script 扮演,不会多此一举吗?
dallaslu
2015-05-27 12:58:42 +08:00
@zhicheng 可不可以发一篇博文之类,让更多人学习一下?
stiekel
2015-05-27 13:34:59 +08:00
@quix @xenme
浏览器端对密码进行md5的目的不是为了程序本身,为是为了防止他人监听网络,获取到传输中的密码——就算获取到了,也只是md5后的值,用户的明文密码并没有出问题。
的确,别人拿到这个md5可以直接用来在应用中登陆,但是,他不会知道用户的明文密码,这样也不会去影响到用户在其它场合中的密码安全。
不只是一次看到有人质疑浏览器端密码加密的做法,所以我还特别强调了一下这样做的原因,结果还是有人有这样的质疑。为什么大家设计程序的时候都只是想着自己安全呢?考虑一下用户的信息的安全又有什么坏处呢?

@dallaslu https对于这块儿的安全的确很有必要。
wy315700
2015-05-27 13:42:04 +08:00
@dallaslu
hmac和普通的password|salt的区别在于,
普通的拼接,其实只是增加了hash前的password长度。

如果用的是 password|salt,那么 password =abc, salt = def 和 password = abcd 和 salt = ef 是没有去别的




@zhicheng
PBKDF2的本质就是
一遍一遍一遍的执行hmac,执行几千几万遍,
zhicheng
2015-05-27 13:50:20 +08:00
@wy315700 hmac 的本质是 hash ,hash 的本质是随机,然而并没有什么卵用。
loading
2015-05-27 13:53:46 +08:00
@BuilderQiu 你知道为什么加盐?我的盐就域名,我把root加密后的字符串贴出来你试试?


都加同一个较长的盐,我个人认为完全没问题,只要保证你别所有应用都是那一个。
BuilderQiu
2015-05-27 14:14:18 +08:00
@loading
本身就是为了加大暴力破解的难度,你这都用同一个SALT,我不能说有问题,你代码里写死也没问题。
只是对构造字典、彩虹表难度有影响罢了。

PS:你密码是coolxxxxxxx?猜一个。

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

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

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

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

© 2021 V2EX