2012-09-16 28 views
0

關於如何使用JAVA創建MYSQL MD5哈希值有很好的帖子,但是有可能以另一種方式 - 使用SQL來生成java所做的?使用MySQL SQL將MD5轉換爲JAVA MD5

Select MD5('secret') = 5ebe2294ecd0e0f08eab7690d2a6ee69 

在Java中,MD5算法中的產率:

在SQL

94-6634-108-20-48-32-16-114-85118-112-46-90-18105

首先,我可以看到的Java一個是十進制表示,所以配對關SQL輸出並轉換到DECIMAL得出:9419034148236208224240142171118144210166238105

這是相同的,唯一的部分是前置2個和最後一個4

任何人有關於如何使用SQL來生成Java會產生什麼的想法?

回答

0

我沒有做這個完全制定出來,但我希望,這些提示將幫助:

在Java中,如果你把md.digest()調用的直接結果,你有一個字節數組。 而不是將其轉換爲字符串表示形式,只需將字節輸出爲整數。 你會看到,他們是:

-66 -108 -20 -48 -32 -16 -114 -85 -112 -46 - 90 -18

因此,結果字符串轉換中的破折號不是分隔符,它們是算術符號。 java散列是一個簡單的字節值串聯(簽名)整數。

當您選擇MD5('祕密')時,您將得到一個32位十六進制數字的字符串。 我驗證瞭如果在Java中,您將每個字節轉換爲它的十六進制表示形式,並將它們連接起來,您將得到MySQL返回的相同字符串。

所以,在我看來,你需要在MySQL中做什麼是一次迭代Hex(),一個十六進制字符的結果(可能使用SUBSTRING()),將每個轉換爲十進制,並連接他們。

編輯 - 看起來像你幾乎做正確,但你需要轉換每對十六進制數字以字節不是int,因此,例如,「0xbe」是-66,而不是190

編輯# 2 - 我對MySQL的這種做法相對困難很感興趣,所以我堅持了(開玩笑的意思)。以下存儲功能似乎可以完成這項工作:

drop function if exists java_md5; 
delimiter | 
create function java_md5(secret VARCHAR(255)) 
    RETURNS VARCHAR(255) 
    DETERMINISTIC 
    BEGIN 
    DECLARE result varchar(255); 
    DECLARE md5String char(255); 
    DECLARE pair char(2); 
    DECLARE pairInt int; 
    DECLARE idx int; 
    set md5String = MD5(secret); 

    set result = ''; 
    set idx = 1; 
    WHILE(idx < 32) DO 
     set pair = substring(md5String, idx, 2); 
     set pairInt = ascii(unhex(pair)); 
     set pairInt = if(pairInt > 127, pairInt - 256, pairInt); 
     set result = concat(result, pairInt); 
     set idx = idx + 2; 
    END WHILE; 
    RETURN result; 
    END| 
delimiter ; 

select java_md5('secret'); 
+0

這就近了!現在的問題是我們如何能夠說明爲什麼或何時一個字節將被表示爲負數。在這個問題的上下文中,我想使用mysql命令來生成java哈希。我要考慮閾值和2s的補充。 – TSage

+0

謝謝你提供了一個很好的解決方案。我只需要澄清,如果它> 127或> 128。 – TSage

+0

有符號字節的最大值是2^7 - 1,它是127.在MySQL中,這是一個TINYINT - 參見http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html – GreyBeardedGeek