我正在使用旧的代码库,该代码库当前OLD_PASSWORD()用作简单的哈希函数。现在,此代码库需要连接到运行最新版本的MySQL 5.7的数据库。
的等效项PASSWORD()似乎是:UPPER(SHA1(UNHEX(SHA1(password))))。
是否有类似的东西OLD_PASSWORD()?
小智 5
我试图直接在 SQL 中为 OLD_PASSWORD 编写一个替换用户定义的函数,它似乎正在工作。代码是这篇文章中的 PHP 版本的翻译。
DROP FUNCTION IF EXISTS OLD_PASSWORD;
DELIMITER $$
CREATE FUNCTION OLD_PASSWORD (input BLOB)
RETURNS CHAR(16)
DETERMINISTIC
BEGIN
DECLARE nr BIGINT;
DECLARE nr2 BIGINT;
DECLARE ad BIGINT;
DECLARE inlen INT;
DECLARE i INT;
DECLARE b CHAR;
DECLARE tmp INT;
DECLARE output CHAR(16);
SET nr = 1345345333;
SET nr2 = 0x12345671;
SET ad = 7;
SET inlen = LENGTH(input);
SET i = 1;
IF (input = '' OR input IS NULL) THEN
RETURN input;
END IF;
WHILE i <= inlen DO
SET b = MID(input, i, 1);
IF b != ' ' AND b != '\t' THEN
SET tmp = ORD(b);
SET nr = nr ^ ((((nr & 63) + ad) * tmp) + ((nr << 8) & 0xFFFFFFFF));
SET nr2 = nr2 + (((nr2 << 8) & 0xFFFFFFFF) ^ nr);
SET ad = ad + tmp;
END IF;
SET i = i + 1;
END WHILE;
SET nr = nr & ((1 << 31) - 1);
SET nr2 = nr2 & ((1 << 31) - 1);
SET output = LOWER(CONCAT(LPAD(HEX(nr),8,'0'), LPAD(HEX(nr2),8,'0')));
RETURN output;
END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助。但请注意:以这种格式保存密码是不安全的。