繁体   English   中英

如何使用PEM私钥通过HMAC在PHP中签名数据

[英]How to sign data in PHP with HMAC using a PEM private key

我看过很多关于如何在PHP中创建HMAC的文章,但是所使用的机密始终是一个简单的字符串(例如“ secret”)。 我需要做的是创建一个HMAC,其秘密是私钥,例如从包含PEM格式私钥的文件中加载。 我一直无法找到有关是否可以在PHP中(使用hash_hmac)的任何信息。

用法

在Java中创建了使用私钥的HmacSHA256签名,我想在PHP中重新创建此签名(根据我的理解,使用带有sha256哈希算法的hash_hmac),并从文件中加载了相同的私钥。

需要说明的是:在这种情况下,私钥用作共享的秘密密钥,这意味着有两个参与者拥有密钥。 消息验证过程包括发送带有私钥计算的消息的HMAC,而收件人则使用相同的私钥计算HMAC并根据发送的签名进行验证。

Java的:

byte[] data = getDataForSignature();
PrivateKey key = getPrivateKey(); // loaded from a file
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] hmac = mac.doFinal(data);
// compare hmac with received signature bytes

PHP:

$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-----

通常,使用私钥来执行签名生成 ,该签名的非对称等同于使用对称密钥创建MAC。

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM