如何使用PHP创建签名

如何使用PHP创建签名,php,rsa,digital-signature,sha256,public-key,Php,Rsa,Digital Signature,Sha256,Public Key,我需要使用API,但首先要登录,我需要创建签名 1. Concatenate the API key with the current timestamp in the format below: <<APIKEY>>_<<timestamp(yyyy'-'MM'-'ddTHH:mm:ss.fffZ)>> 结果是: 9952375A30708B4673986482303CAE30AD51FC9A362B5794D298DFC22F7EC02 这是

我需要使用API,但首先要登录,我需要创建签名

1. Concatenate the API key with the current timestamp in the format below:
<<APIKEY>>_<<timestamp(yyyy'-'MM'-'ddTHH:mm:ss.fffZ)>>
结果是: 9952375A30708B4673986482303CAE30AD51FC9A362B5794D298DFC22F7EC02 这是正确的结果

下一步是:

2. The combination of the created signature along with the provided API secret key will act as the
digital signature of the call.
我有API密钥,如:

    -----BEGIN PUBLIC KEY-----
9IGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgBSU90PX4WyXFAZ/+M84dJNEi
/0j5OermfydTU4g2JvnpO6BOQjNpb5+mOLjVoij7DWTdDtx1WThRm04N3DVuyh+a
5cledvMbcngvyiXpQCdskT9bVmI4QLbmRny46S7MER1jhziMQRfRw9gbmlB2iCEq
n21kDr842Q+WDtLE4QIDAQA9
-----END PUBLIC KEY-----
如何结合创建的签名和提供的API密钥获得数字签名

有一个Python示例,如:

key = api_key + '_' + timestamp

print "message", key

sha_hash = hashlib.sha256(key).hexdigest()

print "sha256 hash:", sha_hash


rsa_key = RSA.importKey(pub_key)
cipher = PKCS1_v1_5.new(rsa_key)
signature = base64.encodestring(cipher.encrypt(sha_hash))

但是如何使用PHP获取签名呢?

虽然有很多方法可以实现这一点,但我建议使用该方法。还有其他的crypt函数,甚至RSA的纯PHP实现,但它们可能不像linux系统上的openSSL那样流行和维护良好。不要忘记过去几年SSL/TLS中的所有中断。从淘汰旧的协议和较弱的密码到狮子狗类型的漏洞攻击

如果出于任何原因,这不是一个选项,我可能会研究phpseclib

真的可以归结为什么对你的项目最有意义。。。操作系统、可移植性、速度等

下面是转换为等效PHP代码的Python代码段

<?php
$key = $api_key . '_' . $timestamp;

echo "message:" . $key;

$sha_hash = hash('sha256', $key);

echo "sha256 hash:" .  $sha_hash;

$rsa_key = "your public key goes in here"; //see https://www.php.net/manual/en/function.openssl-pkey-get-public.php

openssl_public_encrypt($sha_hash, $encrypted, $rsa_key);
$signature = base64_encode($encrypted);


不确定您在哪个平台上,但查看过吗?是的,我想我需要使用openssl\u encript这里有一些其他选项,但我认为openssl通常在大多数系统上维护。FWIW:-旧的,一些信息可能已经过时。@ficuscr你能写一个答案吗?这不是签名,这是RSA加密。
<?php
$key = $api_key . '_' . $timestamp;

echo "message:" . $key;

$sha_hash = hash('sha256', $key);

echo "sha256 hash:" .  $sha_hash;

$rsa_key = "your public key goes in here"; //see https://www.php.net/manual/en/function.openssl-pkey-get-public.php

openssl_public_encrypt($sha_hash, $encrypted, $rsa_key);
$signature = base64_encode($encrypted);