C#vs Java HmacSHA1然后base64

我有一个java代码示例,用于使用HMAC-SHA1算法(RFC 2104)计算摘要,然后使用Base64编码(RFC 2045)进行编码。

这是java代码

public static String buildDigest(String key, String idString) throws SignatureException { try { String algorithm = "HmacSHA1"; Charset charset = Charset.forName("utf-8"); SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), algorithm); Mac mac = Mac.getInstance(algorithm); mac.init(signingKey); return new String(Base64.encodeBase64(mac.doFinal(idString.getBytes(charset))), charset); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } } 

我在Stack Overflow中找到了答案,所以这里是C#代码

  private string EncodeHMAC(string input, byte[] key) { HMACSHA1 myhmacsha1 = new HMACSHA1(key); byte[] byteArray = Encoding.UTF8.GetBytes(input); // MemoryStream stream = new MemoryStream(byteArray); var hashValue = myhmacsha1.ComputeHash(byteArray); return hashValue.Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s); } private string EncodeTo64(string toEncode) { byte[] toEncodeAsBytes = System.Text.UTF8Encoding.UTF8.GetBytes(toEncode); string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); return returnValue; } 

我没有得到我正在遵循的教程中显示的正确结果

尝试这个:

 // This method will return the base 64 encoded string using the given input and key. private string EncodeHMAC(string input, byte[] key) { HMACSHA1 hmac = new HMACSHA1(key); byte[] stringBytes = Encoding.UTF8.GetBytes(input); byte[] hashedValue = hmac.ComputeHash(stringBytes); return Convert.ToBase64String(hashedValue); } 

我认为您没有正确地将散列值转换为基本64字符串。

我使用此函数来实现REST Web服务调用的身份validation。 发送方和接收方使用相同的编码非常重要。

不幸的是,我花了一些时间才找到与此C#版本匹配的PHP HAMAC实现。

 private bool ValidateHash(String uid, String hash, DataToSign data) { StringBuilder strToSign = new StringBuilder(); strToSign.Append(data.HttpMethod + '\n'); strToSign.Append(data.Date.ToString("r") + '\n'); strToSign.Append(data.Uri); Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(this._secretKey); HMACSHA1 hmac = new HMACSHA1(secretBytes); Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(strToSign.ToString()); Byte[] calcHash = hmac.ComputeHash(dataBytes); String calcHashString = Convert.ToBase64String(calcHash); if (calcHashString.Equals(hash)) { if (log.IsDebugEnabled) log.Debug(uid + " - [ValidateHash] HMAC is valid."); return true; } return false; } 

希望有所帮助!