java - HMAC 一个 php 字节数组

标签 java php encoding arrays hmac

我正在尝试将 PHP 后端与 Java 后端集成。 Java 后端需要一些凭据,这些凭据必须正确编码和散列以在两端匹配。

java 系统将字符串转换为字节序列 (1),然后生成该序列的 HMAC/SHA256 key 哈希 (2),然后对哈希进行 Base 64 编码 (3)。

private static final String HMAC_ALGORITHM = "HmacSHA256";
final SecretKey key = new SecretKeySpec('mysecret', HMAC_ALGORITHM);
final Mac hmac = Mac.getInstance(key.getAlgorithm());
hmac.init(key);
final String stringToHash = "blablabla";
final byte[] bytesToHash = stringToHash.getBytes("UTF8");
final byte[] hash = hmac.doFinal(bytesToHash);
return Base64.encodeBytes(hash);

我可以执行 (1) 并使用

将 PHP 中的字符串转换为字节序列
$stringArray = unpack('C*', $string);

//其工作原理与 Java 系统完全相同

但是第二部分(2)似乎不匹配,有没有一种方法可以在 PHP 中将字节数组传递给 hmac,因为在 Java 中,HMAC 方法接受字节数组,而 PHP 方法需要字符串,例如

hash_hmac('sha256', $stringArray, $secret);

或者我需要循环遍历数组并执行一些魔法吗?

谢谢!

最佳答案

我认为你不需要在 php 中解压

尝试一下

hash_hmac('sha256', $string, $secret, TRUE);

注意:我将实际字符串传递给函数,最后一个参数 raw_output 设置为 TRUE

更新

你的java代码似乎是错误的docs

final SecretKey key = new SecretKeySpec('mysecret', HMAC_ALGORITHM);

应该像下面这样

byte[] keyBytes = mysecret.getBytes(); // say mysecret is a String var
final SecretKey key = new SecretKeySpec(keyBytes, HMAC_ALGORITHM);

关于java - HMAC 一个 php 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11134763/

相关文章:

azure - 如何使用 Media Encoder Standard 添加叠加层

java - OOP 设计问题与纸牌游戏

java - Struts 1 和 Spring AOP

java - 为什么 hibernate 不删除行?

php - 自定义 PHP_CodeSniffer (CodeSniffer) 标准

PHP 移动 mySQL 树节点

java - 在 php 中验证来自 java 的 rsa 签名

java - 将资源包读取为 UTF-8。 getString() 方法似乎将编码更改为 ISO-8859

java - 启动空白控制台

python - 如何检测Python中未解码的字符?