OLD_PASSWORD 5.7.5以上版本的功能

Chr*_*oft 3 mysql mysql-5.7

我正在使用旧的代码库,该代码库当前OLD_PASSWORD()用作简单的哈希函数。现在,此代码库需要连接到运行最新版本的MySQL 5.7的数据库。

的等效项PASSWORD()似乎是:UPPER(SHA1(UNHEX(SHA1(password))))

是否有类似的东西OLD_PASSWORD()

Chr*_*oft 5

看起来OLD_PASSWORD()除了使用服务器允许设置全局变量外,没有其他方法可以使用MySQL函数。通过SET @@global.old_passwords = 1;以具有超级权限的用户身份执行查询,该PASSWORD()函数然后使用OLD_PASSWORD()算法对。

如果像上述情况那样您没有超级用户(Google CloudSQL不支持他们),则需要替换算法。以下是不同语言的替代品:

C | Perl | PHP | Python | 的SQL

免责声明:MySQL的密码功能在现代安全性中是一个玩笑,并且尽可能不要使用。另外,看完上述算法后,我不负责任何头问题


小智 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)

希望这会有所帮助。但请注意:以这种格式保存密码是不安全的。