0

我有以下用于检查用户密码的 Oracle 函数,但我想切换到 MySQL。我正在寻找一组能够产生等效结果的 MySQL 函数。

FUNCTION encpasswd (ID IN VARCHAR, passwd IN VARCHAR)

   RETURN VARCHAR

IS

   v_result   VARCHAR2 (4000);

BEGIN

   v_result := DBMS_OBFUSCATION_TOOLKIT.md5 (input_string => ID || passwd);

   --RETURN RAWTOHEX (v_result);

   RETURN v_result;

END encpasswd;
4

2 回答 2

0

MySQL 的MD5函数返回一个由 32 个十六进制字符组成的字符串。它被标记为二进制字符串,但它不是人们期望的 16 字节二进制数据。

因此,要修复它,必须将此字符串转换回二进制数据,例如:

SELECT hex(aes_encrypt('test-data', unhex(MD5('test_key'))));

结果是:

8FCA326C25C8908446D28884394F2E22

MySQL 的 SQLFiddle

它又是一个由 32 个十六进制字符组成的字符串。但除此之外,它与 Oracle 的结果相同。

顺便说一句:

  • MySQL 使用 PKCS7 填充。
  • PKCS5 填充和 PKCS7 填充是一回事。所以 Oracle 填充选项是正确的。
  • MySQL 使用 ECB 分组密码模式。因此,您必须相应地调整代码。(前 16 个字节没有任何区别。)
  • MySQL 不使用初始化向量(与您的 Oracle 代码相同)。
  • MySQL 使用非标准折叠键。因此,要在 MySQL 和 Oracle(或 .NET 或 Java)中获得相同的结果,仅使用 16 字节长的键。
于 2013-10-08T03:45:36.627 回答
0

Mysql 有一个原生的“md5”函数。

SELECT md5(concat(id, passwd)) FROM yourtable

作为一个函数:

CREATE FUNCTION `encpasswd`(`ID` VARCHAR(250), `passwd` VARCHAR(250)) RETURNS VARCHAR(250)
BEGIN
    RETURN md5(concat(ID,passwd))
END
于 2013-10-08T03:45:47.110 回答