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

谢谢

8022 次点击
所在节点    MySQL
78 条回复
liprais
2015-05-27 09:43:54 +08:00
$password = md5($psw.$salt);
这一步做成udf
TangMonk
2015-05-27 09:44:45 +08:00
可以加味精吗
yangqi
2015-05-27 09:45:09 +08:00
select md5(concat(password, salt)) from table
wy315700
2015-05-27 09:45:27 +08:00
1 根据 username查出记录
2 读取salt
3 加密
4 判断password是否一致


只需要一次读取啊。

你的步骤3完全没必要啊
warlock
2015-05-27 09:48:16 +08:00
mysql 提供了 md5 和 字符串连接的方法,不过你为什么要放到数据库去做呢,这不是给数据库施压么。。。。。
ven
2015-05-27 09:55:02 +08:00
好奇问一下,salt直接存在数据库,安全么?
BuilderQiu
2015-05-27 09:56:29 +08:00
一般都是内存处理吧,同 @wy315700 那样,
我只是一直在想,SALT在库里,脱裤了之后还不是一顿暴力破...
coosir
2015-05-27 09:59:19 +08:00
select count(*) from table where username='$username' and password=md5(concat('$username',salt))
wy315700
2015-05-27 10:02:26 +08:00
@BuilderQiu
@ven
salt的作用在于阻止 一次多密,防止直接通过彩虹表进行爆破,但是阻止不了暴力破解。

不同的用户 如果使用相同的密码,但是salt不一样了,hash的结果是不一样的。
所以有了salt以后,对每个用户要单独进行破解,

当然,如果觉得不安全,可以用RSA或者ECC,使用公钥加密或者私钥签名都可以。

@jookr
再提醒一下,直接把pass和salt进行拼接是非常非常不安全的做法,salt的正确做法请使用 hmac
stiekel
2015-05-27 10:04:55 +08:00
目前我觉得最好的做法是:
1、浏览器端,先对密码取两遍md5,传输的时候传md5,就算传输的时候数据泄露,用户的明文密码是安全的。
2、服务器端接收到传过来的密码(取名为GET_PWD),再加一遍md5,取出用户对应的盐(每个用户盐不一样),相加后再取md5,得到数据库中存储的密码密文(取名为DB_SAVED_PWD)
3、用户登陆成功后,生成新的盐,并在GET_PWD的基础上,生成新的DB_SAVED_PWD,分别存储用户的新盐和新DB_SAVED_PWD

盐和数据库中的用户密码是分开存储的。
xenme
2015-05-27 10:05:43 +08:00
1. 从前台收到用户名,根据规则计算出 salt
2. 计算出密码 MD5
3. 查表比对
Septembers
2015-05-27 10:06:37 +08:00
@stiekel 请不要使用md5, sha1
xenme
2015-05-27 10:07:40 +08:00
@stiekel 你这是自欺欺人啊。
取100秒 MD5,意思就是密码其实不是用户的123,而是100遍后的 md5, 中间传输拦截到100遍后的结果,对其他人来说就是密码了。
只是不需要填写,直接 post 而已。
Septembers
2015-05-27 10:09:13 +08:00
@xenme 恩,md5,sha1,都密码学上存在缺陷。。。
BOYPT
2015-05-27 10:15:39 +08:00
嗯,js端做md5都是自欺欺人,然而在业界似乎还挺流行的。
BuilderQiu
2015-05-27 10:19:10 +08:00
还是很多在前端RSA加密的吧。。安全。。也不算太慢。。
quix
2015-05-27 10:19:54 +08:00
@stiekel 浏览器端发送有加密需求的请上 tls md5只能当安慰剂用.
armoni
2015-05-27 10:21:34 +08:00
BCrypt加密 不需要自己设置盐
jiongjionger
2015-05-27 10:37:35 +08:00
select salt,password from table where username = '$username'
这样不就好了么
$password = md5($psw.$salt);
验证$password和取回来一不一样不就完了
dallaslu
2015-05-27 10:46:41 +08:00
引用 @xenme
> 1. 从前台收到用户名,根据规则计算出 salt

「计算出」的过程可逆吗?以用户名做种子的算法也是不安全的,用随机生成的短密钥做盐会好些。

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

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

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

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

© 2021 V2EX