C#HMAC到Java

问题描述:

我正在为下面的代码制作等效的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))); 

在此先感谢! :)

我找到了翻译代码的解决方案。 有两个主要问题。当请求一个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)); 

看到关于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