PHP 中的发送方和接收方之间通过 Public 密钥验证私钥的签名
Verify signature of Private key by Public key between Sender and Receiver in PHP
我为发件人创建了一个 Signature() 函数来签署 his/her 私钥,然后 return $signature
use phpseclib\Crypt\RSA;
public function Signature(Request $request)
{
$agent_code = $request->agent_code;
$private_key = $request->private_key;
$private_passphrase = $request->private_passphrase;
$string = $agent_code;
$private_key = File::get($private_key);
$rsa = new RSA();
$rsa->setPassword($private_passphrase);
$rsa->loadKey($private_key); // private key
$signature = base64_encode($rsa->sign($string));
return $signature;
}
之后,将$signature传递给Verify()函数,让接收方使用his/her public key
验证签名
public function Verify(Request $request)
{
$agent_code = $request->agent_code;
$public_key = $request->public_key;
$signature = $request->signature;
$string = $agent_code;
$public_key = File::get($public_key);
$rsa = new RSA();
$rsa->loadKey($public_key); // public key
echo $rsa->verify($string, base64_decode($signature)) ? 'verified' : 'unverified';
}
然后,我在 Postman 上测试了这两个功能
照片 1 - 3 用于 Signature() 函数
照片 4 - 6 用于 Verify() 函数
照片 1:此 url 将调用 Signature() 函数。 agent_code 和 private_passphrase 参数已填充。 agent_code 是要由私钥签名的字符串,而 private_passphrase 是私钥的密码。
图2:私钥以文件格式附在正文中
照片 3:$签名是 returned
照片 4:此 url 将调用 Verify() 函数。 agent_code 和签名参数已填充。签名是从 Signature() 函数复制的,该函数用于通过 public key
验证
图片 5 : public 密钥作为文件格式以正文形式附加
照片 6:Invalid signature
错误
我不知道为什么return Invalid Signature
,因为如果我把签名和验证码写在一个函数里,它会给我回显'verified'。密钥对正确并且 $signature 被正确复制。
感谢所有指导和指正。
我正在将我的评论转化为答案。
我认为您的问题是由查询参数中的 +
符号引起的 - 它们被识别为 URL 编码的空格。如果您使用 POST 而不是 GET 就不会有任何问题。
为了避免使用URL-encoding 引起的通常的Base64 编码问题,我的建议是使用Base64URL 编码。与正常的 Base64 编码相比,它使用 -
而不是 +
和 _
而不是 /
。
我为发件人创建了一个 Signature() 函数来签署 his/her 私钥,然后 return $signature
use phpseclib\Crypt\RSA;
public function Signature(Request $request)
{
$agent_code = $request->agent_code;
$private_key = $request->private_key;
$private_passphrase = $request->private_passphrase;
$string = $agent_code;
$private_key = File::get($private_key);
$rsa = new RSA();
$rsa->setPassword($private_passphrase);
$rsa->loadKey($private_key); // private key
$signature = base64_encode($rsa->sign($string));
return $signature;
}
之后,将$signature传递给Verify()函数,让接收方使用his/her public key
验证签名 public function Verify(Request $request)
{
$agent_code = $request->agent_code;
$public_key = $request->public_key;
$signature = $request->signature;
$string = $agent_code;
$public_key = File::get($public_key);
$rsa = new RSA();
$rsa->loadKey($public_key); // public key
echo $rsa->verify($string, base64_decode($signature)) ? 'verified' : 'unverified';
}
然后,我在 Postman 上测试了这两个功能
照片 1 - 3 用于 Signature() 函数
照片 4 - 6 用于 Verify() 函数
照片 1:此 url 将调用 Signature() 函数。 agent_code 和 private_passphrase 参数已填充。 agent_code 是要由私钥签名的字符串,而 private_passphrase 是私钥的密码。
图2:私钥以文件格式附在正文中
照片 3:$签名是 returned
照片 4:此 url 将调用 Verify() 函数。 agent_code 和签名参数已填充。签名是从 Signature() 函数复制的,该函数用于通过 public key
验证
图片 5 : public 密钥作为文件格式以正文形式附加
照片 6:Invalid signature
错误
我不知道为什么return Invalid Signature
,因为如果我把签名和验证码写在一个函数里,它会给我回显'verified'。密钥对正确并且 $signature 被正确复制。
感谢所有指导和指正。
我正在将我的评论转化为答案。
我认为您的问题是由查询参数中的 +
符号引起的 - 它们被识别为 URL 编码的空格。如果您使用 POST 而不是 GET 就不会有任何问题。
为了避免使用URL-encoding 引起的通常的Base64 编码问题,我的建议是使用Base64URL 编码。与正常的 Base64 编码相比,它使用 -
而不是 +
和 _
而不是 /
。