2013-10-08 39 views
0

我有以下Oracle函数用于检查用户密码,但我想切换到MySQL。我正在寻找一组将产生相同结果的MySQL函数。将Oracle MD5转换为MySQL或Ruby

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; 
+0

[转换到NVARCHAR2 MD5散列中的Oracle DBMS \ _OBFUSCATION \ _TOOLKIT.MD5]可能重复(http://stackoverflow.com/questions/10827888/convert -nvarchar2-to-md5-hash-in-oracle-dbms-obfuscation-toolkit-md5) –

+0

谢谢。不是这个问题的一个骗局,因为我试图将一个Oracle MD5函数转换为一个MySQL MD5函数。 – stevendaniels

回答

0

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

因此,要解决这个问题,这个字符串必须被转换回二进制数据,例如:

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

结果是:

8FCA326C25C8908446D28884394F2E22 

SQLFiddle for MySQL

这又是一串32个十六进制字符。但除此之外,这与Oracle的结果是一样的。

而且BTW:

  • MySQL使用PKCS7填充。
  • PKCS5填充和PKCS7填充是一样的。所以Oracle填充选项是正确的。
  • MySQL使用ECB分组密码模式。所以你必须相应地调整代码。 (它对前16个字节没有任何影响。)
  • MySQL不使用初始化向量(与您的Oracle代码相同)。
  • MySQL使用非标准折叠键。因此,要在MySQL和Oracle(或.NET或Java)中实现相同的结果,只能使用长度为16个字节的密钥。
+0

因此,在这种情况下,如果id = 1并且passwrd = foo,那么该语句会是什么样子? SELECT hex(aes_encrypt('1',unhex(MD5('foo')))); – stevendaniels

+0

是的。更倾向于。你可以在你的oracle中测试它。 –

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