Java Hmac哈希到C#

时间:2014-01-08 03:49:26

标签: c# java

我需要在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));

0 个答案:

没有答案