Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用PEM私钥在PHP中使用HMAC对数据进行签名_Java_Php_Hash_Signature_Hmac - Fatal编程技术网

Java 如何使用PEM私钥在PHP中使用HMAC对数据进行签名

Java 如何使用PEM私钥在PHP中使用HMAC对数据进行签名,java,php,hash,signature,hmac,Java,Php,Hash,Signature,Hmac,我看过很多关于如何在PHP中创建HMAC的帖子,但是使用的秘密总是一个简单的字符串(例如“secret”)。我需要做的是创建一个HMAC,其秘密是私钥,例如从包含PEM格式私钥的文件加载。我找不到任何关于这在PHP中是否可行的信息(使用hash_hmac) 用法 使用私钥的HmacSHA256签名是在Java中创建的,我想用从文件中加载的相同私钥在PHP中重新创建此签名(据我所知,使用hash_hmac和sha256哈希算法) 澄清: 此场景中的私钥用作共享密钥,这意味着双方都拥有该密钥。消息验

我看过很多关于如何在PHP中创建HMAC的帖子,但是使用的秘密总是一个简单的字符串(例如“secret”)。我需要做的是创建一个HMAC,其秘密是私钥,例如从包含PEM格式私钥的文件加载。我找不到任何关于这在PHP中是否可行的信息(使用hash_hmac)

用法 使用私钥的HmacSHA256签名是在Java中创建的,我想用从文件中加载的相同私钥在PHP中重新创建此签名(据我所知,使用hash_hmac和sha256哈希算法)

澄清: 此场景中的私钥用作共享密钥,这意味着双方都拥有该密钥。消息验证过程包括发送带有消息的HMAC(使用私钥计算),而收件人使用相同的私钥计算HMAC并根据发送的签名进行验证

代码 爪哇:

PHP:

样本私钥

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCSWro05ZKVGxMTCqAyNZRAXp8Gd7wf6vywXRsFckm9MHOAWZL0
SvFAhM6tlCthuPkQb0c+Hx9PWH1+4sW2u3O+VDvjQEB0ZILd79LraBEshK/36Oux
yyw2K+ghk9Yh00nJOzkkonmdZmVxr0AAzw5el2h9yDjlUa1E8BH/1LzBBwIDAQAB
AoGANtwXbHiZh5bMgZi8D9YRqkdNqOj89aHp8loUJOiAR5B/2x64fSYSZLLjniEq
WckyYzyzIdActmtfL07l+ecuLRipsHoHuzjPiiRRnzJQbgBstnB8rHkuN275YSbC
3gE7nyyX0JPEviwqHv++Uig0RCD1ZbrG0SBMKBlGVrFMddECQQDmVguRhRScTJHH
RaXY/zjZtHp0L1dtzzSLM75+ji2UoRy1yK9z+rnE1PM5QC8PQixbwocGwpRIwGQn
hIg1YAM9AkEAoqk+VNbJ9ykoP9r+8o1PrPR1Ff+EIhpTthRyFngHNbNnOFB0D314
+V4wyO+a/gbiIAmvTuOXV/GwOlgnfVDJkwJBAJNHd5QvxPL/3sLNXPN4ljBWP2pl
DwFO2Wkcx/SCEtETh5kQ3mdJbVlXVMJJsQ2PoW923gHLjydJpYDDNJj0cH0CQQCW
8txHOvQ+C9GwQHirenvgExO9EFv8kdXxeNPPCiAWs6AsYGz0Gwpyz/gR4FlDN/wM
ozAu04IVONLDsh8jah9FAkEAsSUvlo7Nh1ITd75kUsStv7Tjxma3SuKViewWCprD
olDNtncfcZC5SrilHAJEabVxGy1fJL3hYvTYfqNkeB1TcA==
-----END RSA PRIVATE KEY-----

通常使用私钥来执行签名生成,这相当于使用对称密钥创建MAC

请注意,HMAC密钥可以由任何二进制字符串组成,因此原则上可以将HMAC与二进制编码的私钥一起使用。也就是说,为HMAC使用非对称私钥是没有意义的。只有持有私钥的人才能验证生成的身份验证标记。相比之下,可以使用密钥对的公钥来验证数字签名



现在,如果您有一个在Java中使用的密钥,那么您需要为PHP
hash_hmac
函数创建相同的(二进制)
key
参数。

首先,感谢您的回答。为了澄清这一点,该场景中的私钥用作共享密钥,这意味着双方都拥有该密钥。消息验证过程包括发送带有消息的HMAC(使用私钥计算),而收件人使用相同的私钥计算HMAC并根据发送的签名进行验证。所以,虽然你的答案没有错,但它不能回答我的问题,如何将存储在文件中的私钥与PHP hash_hmac函数结合使用,创建一个与Mac interface中Java生成的签名相同的签名。如果不显示Java代码和您为PHP所做的尝试,将很难回答这个问题。我将很快解决这个问题。通过
key.getClass().getName()可以得到什么
在Java代码中
PrivateKey
仅为其下方特定类的父级。您是否也可以显示一个示例密钥文件?在这种情况下,
getPrivateKey
似乎是一个重要的函数。@MaartenBodewes它是一个sun.security.rsa.RSAPrivateCrtKeyImpl,我还添加了一个示例keyHmm,Java只使用
byte[]secret=key.getEncoded()作为密钥(谁拥有thunk:))。因此,您使用内部PKCS#8编码作为密钥。这当然不是一个好的做法,但如果你能用PHP中的二进制DER编码对密钥进行编码,那你就太棒了,我想知道到底什么是一种不好的做法,以及关于使用二进制DER编码的第二部分是什么,但这已经是周五晚上了,我很累了;您希望RSA公钥是公开的。你当然不应该把它用在MAC上,这根本没有意义。
$key = openssl_pkey_get_private("private.key");
$sig = hash_hmac("sha256", $data, $key??, true);
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCSWro05ZKVGxMTCqAyNZRAXp8Gd7wf6vywXRsFckm9MHOAWZL0
SvFAhM6tlCthuPkQb0c+Hx9PWH1+4sW2u3O+VDvjQEB0ZILd79LraBEshK/36Oux
yyw2K+ghk9Yh00nJOzkkonmdZmVxr0AAzw5el2h9yDjlUa1E8BH/1LzBBwIDAQAB
AoGANtwXbHiZh5bMgZi8D9YRqkdNqOj89aHp8loUJOiAR5B/2x64fSYSZLLjniEq
WckyYzyzIdActmtfL07l+ecuLRipsHoHuzjPiiRRnzJQbgBstnB8rHkuN275YSbC
3gE7nyyX0JPEviwqHv++Uig0RCD1ZbrG0SBMKBlGVrFMddECQQDmVguRhRScTJHH
RaXY/zjZtHp0L1dtzzSLM75+ji2UoRy1yK9z+rnE1PM5QC8PQixbwocGwpRIwGQn
hIg1YAM9AkEAoqk+VNbJ9ykoP9r+8o1PrPR1Ff+EIhpTthRyFngHNbNnOFB0D314
+V4wyO+a/gbiIAmvTuOXV/GwOlgnfVDJkwJBAJNHd5QvxPL/3sLNXPN4ljBWP2pl
DwFO2Wkcx/SCEtETh5kQ3mdJbVlXVMJJsQ2PoW923gHLjydJpYDDNJj0cH0CQQCW
8txHOvQ+C9GwQHirenvgExO9EFv8kdXxeNPPCiAWs6AsYGz0Gwpyz/gR4FlDN/wM
ozAu04IVONLDsh8jah9FAkEAsSUvlo7Nh1ITd75kUsStv7Tjxma3SuKViewWCprD
olDNtncfcZC5SrilHAJEabVxGy1fJL3hYvTYfqNkeB1TcA==
-----END RSA PRIVATE KEY-----