我试图通过消息和密钥使Java程序生成签名。我的C#程序应该使用相同的消息和密钥生成相同的令牌。
但是,某些东西不能正常工作,因为生成的令牌是不同的。
有人可以找出这两个程序之间的区别以及为什么它们不生成匹配的键吗?
Java代码:
this.algorithm = "hmacSHA256";
private static Mac mac;
String message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
String secretKey = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";
if( mac == null ) {
mac = Mac.getInstance(algorithm);
SecretKeySpec secret = new SecretKeySpec(secretKey.getBytes("US-ASCII"),
mac.getAlgorithm());
mac.init(secret);
}
this.signature = new String(Base64.encodeBase64(mac.doFinal(message.getBytes("US-ASCII"))));
C#代码:
string message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
string secret = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";
secret = secret ?? "";
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new System.Security.Cryptography.HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
参考方案
您的问题与加密无关。我稍稍更改了代码,使其在主函数中独立运行,并且都返回相同的结果:
rO7Ly1WIR+d4AGXaDvIOYH3vVm2NvyFwbr3E3rQaw4I=
我的Java代码是:
package com.test.so;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class MessageHashTest {
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
String algorithm = "hmacSHA256";
String message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
String secretKey = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";
Mac mac = Mac.getInstance(algorithm);
SecretKeySpec secret = new SecretKeySpec(secretKey.getBytes("US-ASCII"),
mac.getAlgorithm());
mac.init(secret);
String signature = new String(Base64.encodeBase64(mac.doFinal(message.getBytes("US-ASCII"))));
System.out.println(signature);
}
}
我的.NET代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace MessageHashTest
{
class Program
{
static void Main(string[] args)
{
string message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
string secret = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
Console.WriteLine(Convert.ToBase64String(hashmessage));
}
}
}
}
您的代码中可能的问题是:
Java中MAC实例的重用。我不知道是否可以使用多次。可能不再为新消息正确初始化它。secret = secret ?? ""
:为什么需要那?您是否在某个地方泄露了秘密?您是否使用错误的密码创建哈希?
我想从微调器类中选择选项时打开新表格我尝试这个但是我有语法错误 令牌“{”的语法错误, 在此之后预期使用SwitchLabel 代币public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tf);…
使用Keycloak获取id_token - java谁知道如何使用Keycloak获取id_token?我一直在Keycloak(Spring,JEE)和邮递员中使用Java。基础工作正常,但我需要id_token,因为有些说法称它们不在access_token中,但存在于id_token中。使用keycloak-core库,我可以获得Keycloak上下文,但是id_token属性始终为null。有想法吗 …
承载错误-invalid_token-找不到签名密钥 - c#我有一个与.Net Core 2.2 API后端接口的Angular 7应用程序。这与Azure Active Directory连接。在Angular 7方面,它已通过AAD进行了正确的身份验证,并且我获得了有效的JWT,如在jwt.io上进行了验证。在.Net Core API方面,我创建了一个带有[Authorize]的简单测试API。当我从Angul…
如何从php中获取datatables jQuery插件的json数据 - php我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…