2010-02-03 88 views
1

Grails 1.1向前在字符串上有'encodeAsMD5' - 有沒有辦法爲函數提供一個salt?md5和salt

典型用途:

${myString.encodeAsMD5()} 

另一種選擇是使用Apache DigestUtils類。

我沒有使用它來做密碼散列 - 相反,我使用它作爲驗證機制來確定創建請求的時間以及收到響應時經過了多少時間。

開始時,我加密了最初創建請求的日期/時間並將其傳遞給客戶端。稍後當客戶端發回一些數據時,它會包含原始散列值,然後用於確定已經過了多少時間。

回答

3

你想要有一個鹽,因爲你想做密碼散列?如果是這樣,請考慮jBCrypt,這是一個安全,非常易於使用的密碼哈希庫。您可能很容易將其作爲Groovy字符串元方法掛鉤。 :-P

如果你沒有進行密碼散列,我不確定鹽會進入哪裏;請隨時在這種情況下詳細說明。如何使用HMAC做加密散列:-)


實例(我在我的例子中使用HmacMD5,但你可以用HmacSHA1HmacSHA256HmacSHA384,或HmacSHA512也):

import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

public byte[] hmacMD5(byte[] key, byte[] data) { 
    Mac mac = Mac.getInstance("HmacMD5"); 
    mac.init(new SecretKeySpec(key, "HmacMD5")); 
    mac.update(data); 
    return mac.doFinal(); 
} 

我很抱歉,這是Java而不是Groovy,但希望它很容易讓你適應。 :-)無論如何,在這個例子中,你的常數值將是關鍵,並且傳入的數據將是數據。

如果您的數據很大(不像您所描述的那樣),您可以多次調用update,哈希將起作用,就好像來自這些調用的數據全部並置在一起。

+0

我更新了我的問題以澄清。不使用此密碼散列。 – 2010-02-03 02:12:42

+1

@Robin:根據你的問題編輯,我是否認爲這裏的「鹽」是指你發送給客戶端的時間戳,你希望它能夠逐字回覆? – 2010-02-03 02:50:40

+0

如果是這樣,驗證散列的一種方法是使用類似HMAC-MD5的東西,並使用您的時間戳作爲HMAC密鑰。 – 2010-02-03 02:57:56

0

難道你不能使用MessageDigestExample)?您必須緩存原始時間戳/散列,或者更好的方式是將入站和出站傳輸存儲在某種審計表中。