2012-09-16 35 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