java - 如何在 Java 中将 HMAC 密钥指定为十六进制
问题描述
我可以使用以下代码成功获得 HMAC SHA256:
public static String getHac(String dataUno, String keyUno) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
SecretKey secretKey = null;
Mac mac = Mac.getInstance("HMACSHA256");
byte[] keyBytes = keyUno.getBytes("UTF-8");
secretKey = new SecretKeySpec(keyBytes,mac.getAlgorithm());
mac.init(secretKey);
byte[] text = dataUno.getBytes("UTF-8");
System.out.println("Hex encode: " + Hex.encode(keyUno.getBytes()));
byte[] encodedText = mac.doFinal(text);
return new String(Base64.encode(encodedText)).trim();
}
产生:
HMAC:9rH0svSCPHdbc6qUhco+nlkt2O7HE0rThV4M9Hbv5aY=
但是,我想得到这个:
HMAC:eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo=
我尝试了一个在线工具,看来我的代码和在线工具之间的区别在于我正在使用密钥类型中的文本。
测试值:
字符串数据=“5515071604000fAIkwJtkeiA:APA91bH_Pb5xB2lrmKWUst5xRuJ3joVE-sb9KoT0zXZuupIEfdHjii-cODj-JMnjyy7hFJUbIRAre9o2yaCU43KaFDmxKlhJhE36Dw0bZ23hCYiUbmm;”
字符串键 = "fc67bb2ee0648a72317dcc42f232fc24f3964a9ebac0dfab6cf47521e121dc6e";
getHac("5515071604000fAIkwJtkeiA:APA91bH_Pb5xB2lrmKWUst5xRuJ3joVE-sb9KoT0zXZuupIEfdHjii-cODj-JMnjyy7hFJUbIRAre9o2yaCU43KaFDmxKlhJhE36Dw0bZ2VntDUn_Zd1EJBuSyCYiUtmmkHfRvRy3hIb", "fc67bb2ee0648a72317dcc42f232fc24f3964a9ebac0dfab6cf47521e121dc6e"));
我的方法的执行返回
9rH0svSCPHdbc6qUhco+nlkt2O7HE0rThV4M9Hbv5aY= (在线返回相同的值,选择key type text)
我期待
eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo= (在线返回相同的值,键类型选择十六进制)
解决方案
假设您使用的是 Apache Commons Codec 1.11,请使用以下内容:
byte[] keyBytes = Hex.decodeHex(keyUno);
getHac 方法
你的代码只是稍微修改了一下,然后看起来像这样:
public static String getHac(String dataUno, String keyUno)
throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException, DecoderException {
SecretKey secretKey;
Mac mac = Mac.getInstance("HMACSHA256");
byte[] keyBytes = Hex.decodeHex(keyUno);
secretKey = new SecretKeySpec(keyBytes, mac.getAlgorithm());
mac.init(secretKey);
byte[] text = dataUno.getBytes("UTF-8");
byte[] encodedText = mac.doFinal(text);
return new String(Base64.encodeBase64(encodedText)).trim();
}
测试
这个 Java 方法给出了预期的结果:
eVXBY4RZmFQcOHHZ5FMRjDLOJ8vCuVGTjy7cHN7pqfo=
推荐阅读
- javascript - 在 CRM 上运行应用程序时出现 javascript 错误
- ionic2 - 如何检测我的应用程序是通过 URL(深度链接)打开还是在 ionic 2 中正常启动?
- loops - 循环遍历两个列表
- javascript - 记住设备并重新连接
- css - 如何最大化。使用 flexbox 每行 8 个项目?
- python - Textblob 在大型数据集上使用 NaiveBayesAnalyzer 时出现内存错误
- python - 根据python中的另一个列表将列表中的字母转换为数字
- simulation - NetLogo 中的永久选择
- android - Android Firebase ML-Kit 通过摄像头实时检测条码
- anylogic - 是否可以将启发式算法与 Anylogic 集成?