Tôi có một ví dụ mã java để thực hiện một phép tính tiêu hóa bằng thuật toán HMAC-SHA1 (RFC 2104.), sau đó được mã hóa bằng cách sử dụng mã hóa Base64 (RFC 2045).C# so với Java HmacSHA1 và sau đó base64
đây là mã 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());
}
}
Tôi tìm thấy câu trả lời ở đây trong Stack Overflow vì vậy đây là đoạn code 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;
}
Tôi không nhận được kết quả đúng hiển thị trong tutorial that I am following
Tại sao bạn chuyển khóa như một chuỗi trong phiên bản Java? Bạn có chắc rằng kết quả của phương thức Java 'key.getBytes()' tương đương với mảng byte mà bạn đang sử dụng trong phiên bản C# không? Nếu tôi hiểu mã C# của bạn một cách chính xác, nó cũng trả về mã hex HMAC, trong khi phiên bản Java sử dụng Base64. – jarnbjo