2011-02-15 87 views
1

我正在爲下面的代碼製作等效的java代碼。但我可以做一些返回相同結果的東西encodedString。我可以使用什麼Java類來實現相同的結果?C#HMAC到Java

//Set the Hash method to SHA1 
HMAC hash; 
switch (validation) 
{ 
    case MachineKeyValidation.MD5: 
     hash = new HMACMD5(); 
     break; 
    case MachineKeyValidation.SHA1: 
    default: 
     hash = new HMACSHA1(); 
     break; 
} 
//Get the hash validation key as an array of bytes 
hash.Key = HexToByte(validationKey); 
//Encode the password based on the hash key and 
//converts the encrypted value into a string 
encodedString = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password))); 

在此先感謝! :)

回答

2

我找到了翻譯代碼的解決方案。 有兩個主要問題。當請求一個HMACSHA1我不是在說一個SHA1算法,而是一個HmacSHA1。 Java和C#的編碼有所不同。我使用了正確的密鑰和正確的算法,但編碼是不同的。

SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1"); 
Mac mac = Mac.getInstance("HmacSHA1"); 
mac.init(signingKey); 
// The big problem is difference between C# and Java encoding 
byte[] rawHmac = mac.doFinal(data.getBytes("UTF-16LE")); 
result = new String(Base64.encode(rawHmac)); 
1

看到關於computing hash functions in Java的這個問題。

然後看看javadoc的java.security.MessageDigest.getInstance(String algorithm)

編輯補充:

嘗試運行以下應用程序,看看你有什麼註冊商。


import java.security.Provider; 
import java.security.Security; 

public class SecurityTest { 

    public static void main(String[] args) { 

     Provider[] providers = Security.getProviders(); 
     for (Provider p : providers) { 
      System.out.println(p.toString()); 
     } 
    } 
} 

您應該至少列出幾個Sun提供商。否則,您可能需要下載一些安全庫。

+0

它不工作:「java.security.NoSuchAlgorithmException:找不到任何配套商SHA1」 – Victor 2011-02-15 19:58:52

+0

編輯,以添加一些代碼來幫助你縮小問題。 – 2011-02-15 20:52:15