4

在将密码插入数据库之前,我总是在 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专家)

4

3 回答 3

2

数据库独立是一件好事。我将所有 DBMS 系统视为简单的 SQL 引擎。

添加

这些天来,酷孩子甚至不使用 SQL。相反,使用了中间对象关系映射(ORM) 层。例如 Rails 中的 ActiveRecord 或类似的。

PHP ORM

关于PHP 的 ORM 库的一个 SO 问题。没有 SQL!

最后的想法

最后,从性能的角度来看,通常是 DBMS 的可扩展性最低。-- 应用层可以比数据存储分片快得多。所以你的里程可能会有所不同,但我会小心假设将更多功能移动到 DBMS 层将是整个系统的胜利。

相反,通常是相反的——在合理的情况下将功能移出 DBMS。例如,尽管 DBMS 系统包括他们自己的查询缓存,但这些天来广泛使用 MemCache。

于 2011-08-25T02:40:19.807 回答
2

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

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

因此,您将引入系统安全性的弱点。

于 2011-08-25T02:48:27.983 回答
1

主要问题是,如果在 MySQL 中进行,则无法迭代散列函数。未能迭代您的哈希函数会使您容易受到离线暴力攻击,因为 SHA2 非常快。

您真的应该使用众所周知的密码存储功能,例如 bcrypt 或 PBKDF2,这可能在 MySQL 中本身不支持。

有关密码存储以及为什么需要使用好的、缓慢的函数的详细讨论,请参阅这篇文章。

于 2011-08-25T02:41:16.537 回答