DanilMD

Mysql 8 function old_password

Nov 27th, 2025 (edited)
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 1.28 KB | None | 0 0
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS old_password_compat$$
  4.  
  5. CREATE FUNCTION old_password_compat(p_pass VARCHAR(255))
  6. RETURNS VARCHAR(16)
  7. DETERMINISTIC
  8. BEGIN
  9.     DECLARE nr  BIGINT UNSIGNED DEFAULT 1345345333;
  10.     DECLARE add_ BIGINT UNSIGNED DEFAULT 7;
  11.     DECLARE nr2 BIGINT UNSIGNED DEFAULT 305419889; -- 0x12345671
  12.     DECLARE tmp BIGINT UNSIGNED;
  13.     DECLARE i   INT DEFAULT 1;
  14.     DECLARE ch  INT;
  15.     DECLARE len INT;
  16.  
  17.     -- убираем пробелы по краям
  18.     SET p_pass = TRIM(p_pass);
  19.     SET len = CHAR_LENGTH(p_pass);
  20.  
  21.     WHILE i <= len DO
  22.         SET ch = ORD(SUBSTRING(p_pass, i, 1));
  23.  
  24.         -- пропускаем ' ' и TAB, как в оригинальном алгоритме
  25.         IF ch <> 32 AND ch <> 9 THEN
  26.             SET tmp = ((nr & 63) + add_) * ch + (nr << 8);
  27.             SET nr  = nr ^ tmp;
  28.             SET nr2 = nr2 + ((nr2 << 8) ^ nr);
  29.             SET add_ = add_ + ch;
  30.  
  31.             -- имитация 31-битного диапазона (0x7FFFFFFF)
  32.             SET nr  = nr  & 2147483647;
  33.             SET nr2 = nr2 & 2147483647;
  34.         END IF;
  35.  
  36.         SET i = i + 1;
  37.     END WHILE;
  38.  
  39.     RETURN CONCAT(
  40.         LPAD(LOWER(HEX(nr)), 8, '0'),
  41.         LPAD(LOWER(HEX(nr2)), 8, '0')
  42.     );
  43. END$$
  44.  
  45. DELIMITER ;
  46.  
Advertisement
Add Comment
Please, Sign In to add comment