我需要在C#中创建HMACSHA1以使用Java Web服务。我相信Java实现可能存在缺陷,因为我已经使用一些在线服务广泛地测试了我的结果。我不太了解Java,我需要让我的C#代码生成与Java代码相同的内容,即使它在技术上不正确。
Java版本:
public static byte[] computeSignature(String algorithm, byte[] data, byte[] sharedSecret) {
try {
SecretKey secretKey = new SecretKeySpec(Base64.decode(sharedSecret), algorithm);
Mac mac = Mac.getInstance(algorithm);
mac.init(secretKey);
mac.update(data);
return Base64.encode(mac.doFinal());
} catch (NoSuchAlgorithmException e) {
throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
} catch (InvalidKeyException e) {
throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
}
}
C#版本:
private string GetHash(string message, string key)
{
message = message.Replace("\r", "");
Encoding encoding = new UTF8Encoding();
var keyByte = encoding.GetBytes(key);
var hmacsha1 = new HMACSHA1(keyByte);
hmacsha1.Initialize();
byte[] messageBytes = encoding.GetBytes(message);
var hashmessage = hmacsha1.ComputeHash(messageBytes);
var sigB64 = Convert.ToBase64String(hashmessage);
return sigB64;
}
使用以下消息和密钥:
消息:The quick brown fox jumps over the lazy dog
秘密:key
我得到以下结果:
C#:3nybhbi3iqa8ino29wqQcBydtNk=
Java:K6f3B61fGHxBLeMQZYPDER1mjeg=
我很确定Base64编码是发生差异的地方,但我不确定。
所以,我的问题是 - 如何让我的C#代码产生与Java示例相同的输出?
P.S。 java代码具有以下导入:
com.sun.jersey.core.util.Base64;
修改 以下是调用java函数的方法:
String signature = new String(HmacUtils.computeSignature("HmacSHA1", canonicalRepresentation.getBytes(), sharedSecret.getBytes()));
String authorization = "HMAC " + publicKey + " " + signature;
clientRequest.getHeaders().put(HttpHeaders.AUTHORIZATION, Lists.<Object>newArrayList(authorization));