使用MySQL SQL将MD5转换为JAVA MD5

时间:2012-09-16 15:41:13

标签: sql

关于如何使用JAVA创建MYSQL MD5哈希有很好的帖子,但是可以采用其他方式 - 使用SQL来生成java的功能吗?

SQL中的

Select MD5('secret') = 5ebe2294ecd0e0f08eab7690d2a6ee69

在Java中,MD5算法产生:94-6634-108-20-48-32-16-114-85118-112-46-90-18105

首先,我可以看到Java one是十进制表示,因此将SQL输出与转换为DECIMAL配对会产生:9419034148236208224240142171118144210166238105

唯一相同的部分是前2和后4。

任何人都有关于如何使用SQL生成Java会产生什么的想法?

1 个答案:

答案 0 :(得分:0)

我没有完全解决这个问题,但希望这些提示会有所帮助:

在Java中,如果你采用md.digest()调用的直接结果,你就有了一个字节数组。 而不是将其转换为String表示,只需将字节输出为整数。 你会发现它们是:

94 -66 34 -108 -20 -48 -32 -16 -114 -85 118 -112 -46 -90 -18 105

因此,结果字符串转换中的破折号不是分隔符,而是算术符号。 java散列是字节值的简单串联,是(带符号)整数。

当您选择MD5('secret')时,您将获得一个32位十六进制数字的字符串。 我验证了如果在Java中,您将每个字节转换为它的十六进制表示,并连接它们,您将获得与MySQL返回的相同的字符串。

所以,在我看来,你需要在MySQL中做的是迭代Hex()的结果,一次一个十六进制字符(可能使用SUBSTRING()),将每个转换为十进制,并连接它们

编辑 - 看起来你差不多正确,但你需要将每对十六进制数字转换为Byte而不是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');