MySQL中的MD5是一种广泛使用的加密散列函数,它可以将任意长度的数据转换为一个固定长度(128位)的散列值。MD5的主要用途是验证数据的完整性,例如密码存储、文件校验等。
MySQL中的MD5函数主要有以下几种:
MD5(str):对字符串str进行MD5加密,返回一个32位的十六进制字符串。MD5_UNSIGNED(str):与MD5(str)类似,但返回的是一个无符号整数。-- 创建一个表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password_hash CHAR(32) NOT NULL
);
-- 插入一条记录,密码为 'password123'
INSERT INTO users (username, password_hash) VALUES ('user1', MD5('password123'));
-- 查询并验证密码
SELECT * FROM users WHERE username = 'user1' AND password_hash = MD5('password123');原因:MD5加密算法虽然不可逆,但存在大量的碰撞(即不同的输入产生相同的散列值),并且存在彩虹表等工具可以快速破解常见的MD5散列值。
解决方法:
-- 使用加盐的示例
DELIMITER $$
CREATE FUNCTION salted_md5(input VARCHAR(255), salt VARCHAR(255)) RETURNS CHAR(32)
DETERMINISTIC
BEGIN
RETURN MD5(CONCAT(salt, input));
END$$
DELIMITER ;
-- 插入一条记录,密码为 'password123',盐为 'randomsalt'
INSERT INTO users (username, password_hash) VALUES ('user2', salted_md5('password123', 'randomsalt'));希望这些信息对你有所帮助!