mysql - 自动加密varchar MySQL

标签 mysql sql encryption

我在 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/

相关文章:

php - 如何检查mysql中是否使用了限制?

mysql - sql 3表联合

encryption - OpenSSL EVP_CIPHER_CTX 获取更新 IV

javascript - Node : Can't sign in nodeJS 10. 14.2

php - 如何从 Laravel 中的 SQL 注入(inject)中保护此 sql 查询?

mysql - 当列在多行中等于或不等于值时匹配

java - MySQL数据库查询率高的Java程序如何优化

sql - 如何在 Spark SQL 中格式化日期?

MYSQL 从数据库获取即将到来的生日(unix 时间戳)

java - 在 Java 中执行 AES 解密时出现奇怪的字符