2017-08-08 292 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