2017-08-08 289 views
-1

我需要在Groovy(Grails的)一个MD5哈希,让完全相同的结果作为一个我在C#C#MD5哈希Groovy的MD5哈希

的C#代码使用MD5函数

tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpIn);

什么功能是有在Groovy,我可以使用?

我试图

licenseKeys = MessageDigest.getInstance("MD5").digest(tempAr).encodeHex()

但是,这给了我几乎相同的结果,有些时候它在不同的位置多余的零,该代码的其余部分并不像它只是使字符串转换成字节和我重要知道MD5是旧的,不安全的,但仍然有使用它

当输入AAAAAAAA C#的输出为
87D746DB2DB357978BC97C92123622
和常规
87D746DB2D0B357978BC970C92123622

但随着输入作为AAAAA其同
C94EE213E7FA6887256D143E924227C4

获得在常规的tempAr我做这个

byte[] array = temp.getBytes("UTF-8") 
byte[] tempAr = new byte[array.size() * 2] 

// to add 0 after each byte 
for (int i = 0; i < tempAr.size(); i++){ 
    if (!(i%2)){  
     tempAr[i] = array[((int)(i * 0.5))] 
    } 
    else{ 
     tempAr[i] = 0 
    } 
} 

我这是因为这个原因旧的C#代码做它好,我知道它的怪异......

C#代码以获得字节是

tmpIn = UnicodeEncoding.Unicode.GetBytes(txtFirstname.Text + txtLastname.Text); 
+4

额外的零在哪里?你有一个例子吗?你期望什么?你如何定义“有时”? –

+0

一般来说,第一个错误是:“make a ** MD5 ** hash”,而对于某些用法,MD5通常是可以接受的,现在是时候移动到至少SHA-256。 – zaph

+0

当我使用标准功能并得到奇怪和/或不正确的结果时,我的第一个想法是“我做错了”™。请提供[MCVE],其中包含输入和输出数据。 – zaph

回答

0

的问题是C#版本不显示“0”字。结果应该是16个字节,显示为十六进制的32个字符,C#结果很短。

 
87D746DB2D B357978BC97 C92123622 C# 
87D746DB2D0B357978BC970C92123622 groovy 

显示代码有错误。

注:

C94EE213E7FA6887256D143E924227C4
是相同的,因为在C#或常规显示中没有“0”字符。

+0

但是,当我输入_aaaa_ 输出是相同的,它有“0”字符在它 _86D062828C1DBCE2A48D93742BD3F8E_ – Faunus

+0

@Faunus这是在C#显示代码,蚱蜢的错误。不同之处在于“0”在最重要的最低有效字节上。 '0B'对'D0'。猜测:在C#格式化代码中,未指定“0”字符。添加C#十六进制格式代码,而不是groovy代码。 – zaph