1

我正在为下面的代码制作等效的 java 代码。但是我可以为encodedString返回相同的结果。我可以使用什么 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)));

提前致谢!:)

4

2 回答 2

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));
于 2011-02-16T17:30:04.757 回答
1

请参阅有关在 Java 中计算哈希函数的问题。

并查看java.security.MessageDigest.getInstance(String algorithm)的 javadoc 。

编辑添加:

尝试运行以下应用程序以查看您注册了哪些提供商。


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 提供程序。如果没有,您可能需要下载一些安全库。

于 2011-02-15T19:04:40.183 回答