c# 和 java - hmacsha256 hash Redux 之间的区别
c# and java - difference between hmacsha256 hash Redux
在测试之前 post 中关于 java 和 c# hmacsha256 实现输出之间差异的代码时,我注意到输出略有不同,即当我 运行 java 代码输出为
ivEyFpkagEoghGnTw_LmfhDOsiNbcnEON50mFGzW9_w=
但在 C# 代码中我得到
ivEyFpkagEoghGnTw/LmfhDOsiNbcnEON50mFGzW9/w=
有没有人看到这个,即 java 示例中有一个 _
,但 c# 示例中有一个 /
Java代码
import java.util.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class Test {
public static void main (String[] args) throws Exception {
String secretAccessKey = "mykey";
String data = "my data";
byte[] secretKey = secretAccessKey.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(secretKey, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] bytes = data.getBytes();
byte[] rawHmac = mac.doFinal(bytes);
System.out.println(Base64.getUrlEncoder().encodeToString(rawHmac));
}
}
C#代码
using System;
using System.Security.Cryptography;
using System.Text;
class Test
{
static void Main()
{
String secretAccessKey = "mykey";
String data = "my data";
byte[] secretKey = Encoding.UTF8.GetBytes(secretAccessKey);
HMACSHA256 hmac = new HMACSHA256(secretKey);
hmac.Initialize();
byte[] bytes = Encoding.UTF8.GetBytes(data);
byte[] rawHmac = hmac.ComputeHash(bytes);
Console.WriteLine(Convert.ToBase64String(rawHmac));
}
}
这似乎是 Base64 编码器的设计选择,其中一个选择使用 _
字符,其中一个选择使用 /
字符(C# 也使用 +
字符而不是 -
字符)。如果您需要跨语言使用该字符串,您可以使用 myString.replace(oldChar, newChar)
(C# 中的 myString.Replace(oldChar, newChar)
)替换不匹配的字符。
如果您希望 C# Base64 字符串看起来像 Java 的 Base64 字符串,您可以使用 Microsoft.IdentityModel.Tokens.Base64UrlEncoder
,但这是您必须安装的 Nuget 包。这使用 -
和 _
而不是 +
和 /
.
在测试之前 post 中关于 java 和 c# hmacsha256 实现输出之间差异的代码时,我注意到输出略有不同,即当我 运行 java 代码输出为
ivEyFpkagEoghGnTw_LmfhDOsiNbcnEON50mFGzW9_w=
但在 C# 代码中我得到
ivEyFpkagEoghGnTw/LmfhDOsiNbcnEON50mFGzW9/w=
有没有人看到这个,即 java 示例中有一个 _
,但 c# 示例中有一个 /
Java代码
import java.util.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class Test {
public static void main (String[] args) throws Exception {
String secretAccessKey = "mykey";
String data = "my data";
byte[] secretKey = secretAccessKey.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(secretKey, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
byte[] bytes = data.getBytes();
byte[] rawHmac = mac.doFinal(bytes);
System.out.println(Base64.getUrlEncoder().encodeToString(rawHmac));
}
}
C#代码
using System;
using System.Security.Cryptography;
using System.Text;
class Test
{
static void Main()
{
String secretAccessKey = "mykey";
String data = "my data";
byte[] secretKey = Encoding.UTF8.GetBytes(secretAccessKey);
HMACSHA256 hmac = new HMACSHA256(secretKey);
hmac.Initialize();
byte[] bytes = Encoding.UTF8.GetBytes(data);
byte[] rawHmac = hmac.ComputeHash(bytes);
Console.WriteLine(Convert.ToBase64String(rawHmac));
}
}
这似乎是 Base64 编码器的设计选择,其中一个选择使用 _
字符,其中一个选择使用 /
字符(C# 也使用 +
字符而不是 -
字符)。如果您需要跨语言使用该字符串,您可以使用 myString.replace(oldChar, newChar)
(C# 中的 myString.Replace(oldChar, newChar)
)替换不匹配的字符。
如果您希望 C# Base64 字符串看起来像 Java 的 Base64 字符串,您可以使用 Microsoft.IdentityModel.Tokens.Base64UrlEncoder
,但这是您必须安装的 Nuget 包。这使用 -
和 _
而不是 +
和 /
.