mysql - 为什么你会选择在应用层散列密码,而不是使用 mysql SHA2()?

标签 mysql security hash mysql5

在将密码插入数据库之前,我总是在 php(或其他)中散列密码。今天我发现 mysql 5.5 内置了哈希,所以我可以这样做:

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| user_id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_uname      | varchar(63)  | YES  | UNI | NULL    |                |
| user_password   | binary(32)   | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

--set password
UPDATE users SET user_password=UNHEX(SHA2(CONCAT('username','salt'), 256))\
WHERE user_id = 1;

-- validate password 
SELECT (SELECT user_password FROM users WHERE user_id=1) = \
SHA2(CONCAT('username','salt'), 256);

这可能是个坏主意,有什么理由吗? (无论如何我都不是 mysql 专家)

最佳答案

那不是散列密码;但如果它是(如果你在那里传递明文密码)......

数据库连接协议(protocol)一般是不加密的。不使用此功能的一个原因是您通过网络以明文形式发送密码。如果有人控制了您的网络服务器和数据库之间路径上的路由器,他们就可以拦截这些数据。

因此,您会在系统安全性方面引入弱点。

关于mysql - 为什么你会选择在应用层散列密码,而不是使用 mysql SHA2()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184524/

相关文章:

php - 如何在 zend 框架中同时使用 COUNT 和 DISTINCT?

Python - 释放/替换字符串变量,它是如何处理的?

string - 如何以尽可能小的可打印方式表示 32 字节的二进制数据

java - IP 地址的哈希函数

java - MySql Connector J JDBC 驱动程序不支持连接池吗?

mysql - Delphi连接在线sql数据库

mysql - SQL 获取 WHERE 条件顺序

iOS 开发安全建议

wcf - WCF通过所有服务调用传递额外的安全性数据

performance - 获取哈希表中键列表的时间复杂度?