C#HMAC到Java
-
14-11-2019 - |
题
我正在下面的代码的等效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)));
提前感谢! :)
解决方案
我找到了翻译代码的解决方案。
有两个主要问题。当一个请求A 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));
其他提示
参见在java 中的计算散列函数。