我有一個java代碼示例,使用HMAC-SHA1算法(RFC 2104)計算摘要,然後使用Base64編碼(RFC 2045)進行編碼。C#vs Java HmacSHA1然後base64
這裏是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());
}
}
我在這裏找到答案在堆棧溢出所以這裏的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;
}
我沒有收到在tutorial that I am following
爲什麼在Java版本中將密鑰作爲字符串傳遞?您確定Java方法'key.getBytes()'的結果等同於您在C#版本中使用的字節數組嗎?如果我正確理解你的C#代碼,它也會返回HMAC十六進制編碼,而Java版本使用Base64。 – jarnbjo