我在 mysql 中有一个包含 5 个字段的表。它们是这样排列的:
id | name | email | username | password
我想做的是在插入值时自动散列密码,而无需调用 md5 函数。
所以这是我尝试用来获得影响的查询:
CREATE TABLE users (
id int NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
username VARCHAR(255) NOT NULL,
password md5(VARCHAR(255)) NOT NULL,
PRIMARY KEY(id)
);
我可以做这样的事情吗?还是只要有 INSERT INTO
语句,我就必须调用 md5()?
我知道 md5 不如其他加密算法安全,等等。无需建议其他加密算法。
最佳答案
您可以使用触发器来完成此操作。例如:
mysql> CREATE TRIGGER t BEFORE INSERT ON users
FOR EACH ROW SET NEW.password = MD5(NEW.password);
mysql> INSERT INTO users (username, email, name, password)
VALUES ('user1', 'user1@example.com', 'user1', 'xyzzy');
mysql> SELECT * FROM users;
+----+-------+-------------------+----------+----------------------------------+
| id | name | email | username | password |
+----+-------+-------------------+----------+----------------------------------+
| 1 | user1 | user1@example.com | user1 | 1271ed5ef305aadabc605b1609e24c52 |
+----+-------+-------------------+----------+----------------------------------+
您还应该创建一个类似的触发器BEFORE UPDATE
。
这也造成了一种情况,即对密码列使用 long varchar 数据类型是合法的,即使 MD5 散列根据定义只有 32 个字符。如果我们将 varchar 限制为 32 个字符,那么没有人可以创建超过 32 个字符的密码,因为长度检查是在触发器修改值之前完成的。
mysql> INSERT INTO users (username, email, name, password)
VALUES ('user1', 'user1@example.com', 'user1', 'xyzzjfdkfjdsljfdskfjdslfjdsklfjfjdklfjdslkfjdslfjsdlky');
ERROR 1406 (22001): Data too long for column 'password' at row 1
顺便说一句,MD5 通常被认为太弱而不能用作密码哈希函数。请改用 SHA2。
在散列之前将密码与随机盐连接起来也是一个好主意。参见 You're Probably Storing Passwords Incorrectly .
关于mysql - 自动加密varchar MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020806/