2013-10-08 36 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