簡體   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