`CryptoJS.HmacSHA256` 的 C# 等价物是什么
What is the C# equivalent of `CryptoJS.HmacSHA256`
我有一些用 javascript 编写的代码如下,可以正常工作:
var generateSignature = function(apiKey, apiSecret, meetingNumber, role) {
// Prevent time sync issue between client signature generation and zoom
var timestamp = new Date().getTime() - 30000;
var msg = btoa(apiKey + meetingNumber + timestamp + role);
var hash = window.CryptoJS.HmacSHA256(msg, apiSecret);
var hashedBaseItems = CryptoJS.enc.Base64.stringify(hash);
var encodableString = apiKey + "." + meetingNumber + "." + timestamp + "." + role + "." + hashedBaseItems;
signature = btoa(encodableString);
return signature;
}
我正在尝试将它们转换为 C# 等效项,但结果好坏参半。这是我目前所拥有的:
public string GenerateSignature(int role, long meetingNumber)
{
// Prevent time sync issue between client signature generation and zoom
long timeStamp = this.getLinuxEpochTimestamp() - 30000;
string baseItems = _plusConfig.Value.ZoomApiKey + meetingNumber + timeStamp + role;
string msg = this.jsbtoaEquivalentEncoding(baseItems);
string hashedBaseItems = generateHash(msg, _plusConfig.Value.ZoomApiSecret);
string dottedItems = _plusConfig.Value.ZoomApiKey + "." + meetingNumber + "." + timeStamp + "." + role + "." + hashedBaseItems;
return this.jsbtoaEquivalentEncoding(dottedItems);
}
private long getLinuxEpochTimestamp()
{
return (long) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
}
private string jsbtoaEquivalentEncoding(string toEncode)
{
byte[] bytes = Encoding.GetEncoding(28591).GetBytes(toEncode);
string toReturn = System.Convert.ToBase64String(bytes);
return toReturn;
}
private static string generateHash(string str, string cypherkey)
{
// based on CryptoJS.enc.Base64.parse
byte[] keyBytes = Convert.FromBase64String(cypherkey);
using (HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes))
{
byte[] hashmessage = hmacsha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str));
return Convert.ToBase64String(hashmessage);
}
}
我做错了什么 generateHash
函数返回的东西与 CryptoJS.HmacSHA256 函数完全不同?
private static string generateHash(string str, string cypherkey)
{
var encoding = new System.Text.ASCIIEncoding();
var messageBytes = encoding.GetBytes(str);
var keyBytes = encoding.GetBytes(cypherkey);
using var hmacsha256 = new HMACSHA256(keyBytes);
var hashmessage = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
应该可以解决问题。
我有一些用 javascript 编写的代码如下,可以正常工作:
var generateSignature = function(apiKey, apiSecret, meetingNumber, role) {
// Prevent time sync issue between client signature generation and zoom
var timestamp = new Date().getTime() - 30000;
var msg = btoa(apiKey + meetingNumber + timestamp + role);
var hash = window.CryptoJS.HmacSHA256(msg, apiSecret);
var hashedBaseItems = CryptoJS.enc.Base64.stringify(hash);
var encodableString = apiKey + "." + meetingNumber + "." + timestamp + "." + role + "." + hashedBaseItems;
signature = btoa(encodableString);
return signature;
}
我正在尝试将它们转换为 C# 等效项,但结果好坏参半。这是我目前所拥有的:
public string GenerateSignature(int role, long meetingNumber)
{
// Prevent time sync issue between client signature generation and zoom
long timeStamp = this.getLinuxEpochTimestamp() - 30000;
string baseItems = _plusConfig.Value.ZoomApiKey + meetingNumber + timeStamp + role;
string msg = this.jsbtoaEquivalentEncoding(baseItems);
string hashedBaseItems = generateHash(msg, _plusConfig.Value.ZoomApiSecret);
string dottedItems = _plusConfig.Value.ZoomApiKey + "." + meetingNumber + "." + timeStamp + "." + role + "." + hashedBaseItems;
return this.jsbtoaEquivalentEncoding(dottedItems);
}
private long getLinuxEpochTimestamp()
{
return (long) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
}
private string jsbtoaEquivalentEncoding(string toEncode)
{
byte[] bytes = Encoding.GetEncoding(28591).GetBytes(toEncode);
string toReturn = System.Convert.ToBase64String(bytes);
return toReturn;
}
private static string generateHash(string str, string cypherkey)
{
// based on CryptoJS.enc.Base64.parse
byte[] keyBytes = Convert.FromBase64String(cypherkey);
using (HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes))
{
byte[] hashmessage = hmacsha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str));
return Convert.ToBase64String(hashmessage);
}
}
我做错了什么 generateHash
函数返回的东西与 CryptoJS.HmacSHA256 函数完全不同?
private static string generateHash(string str, string cypherkey)
{
var encoding = new System.Text.ASCIIEncoding();
var messageBytes = encoding.GetBytes(str);
var keyBytes = encoding.GetBytes(cypherkey);
using var hmacsha256 = new HMACSHA256(keyBytes);
var hashmessage = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
应该可以解决问题。