加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 混淆了API签名的公钥和私钥对

发布时间:2020-12-13 16:22:17 所属栏目:PHP教程 来源:网络整理
导读:我创建了一个需要使用签名请求进行授权的API. 我正在使用php openssl_sign和openssl_verify函数. 我理解公钥和私钥的概念(DSA算法).但基本上我不知道如何实现它. 我是从http://uk.php.net/manual/en/function.openssl-sign.php开始的这个例子 ?php$data = "B
我创建了一个需要使用签名请求进行授权的API.

我正在使用php openssl_sign和openssl_verify函数.
我理解公钥和私钥的概念(DSA算法).但基本上我不知道如何实现它.

我是从http://uk.php.net/manual/en/function.openssl-sign.php开始的这个例子

<?php
$data = "Beeeeer is really good.. hic...";

// You can get a simple private/public key pair using:
// openssl genrsa 512 >private_key.txt
// openssl rsa -pubout <private_key.txt >public_key.txt

// IMPORTANT: The key pair below is provided for testing only. 
// For security reasons you must get a new key pair
// for production use,obviously.

$private_key = <<<EOD
-----BEGIN RSA PRIVATE KEY----- 
MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
-----END RSA PRIVATE KEY-----
EOD;
$public_key = <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
-----END PUBLIC KEY-----
EOD;

$binary_signature = "";

// At least with PHP 5.2.2 / OpenSSL 0.9.8b (Fedora 7)
// there seems to be no need to call openssl_get_privatekey or similar.
// Just pass the key as defined above
openssl_sign($data,$binary_signature,$private_key,OPENSSL_ALGO_SHA1);

// Check signature
$ok = openssl_verify($data,$public_key,OPENSSL_ALGO_SHA1);
echo "check #1: ";
if ($ok == 1) {
    echo "signature ok (as it should be)n";
 } elseif ($ok == 0) {
    echo "bad (there's something wrong)n";
} else {
    echo "ugly,error checking signaturen";
}

$ok = openssl_verify('tampered'.$data,OPENSSL_ALGO_SHA1);
echo "check #2: ";
if ($ok == 1) {
    echo "ERROR: Data has been tampered,but signature is still valid! Argh!n";
} elseif ($ok == 0) {
    echo "bad signature (as it should be,since data has beent tampered)n";
} else {
    echo "ugly,error checking signaturen";
}
?>

但我很想知道如何将其实现为URI请求.

在http get请求中使用私钥和公钥似乎很大,客户端如何能够生成可由服务器验证的签名?

解决方法

基本上这里有三件事加密:

>生成公钥和一对私钥
>使用私钥1和公钥加密数据
>使用公钥和私钥2解密数据

步骤1只发生一次,您可以为两个客户端(或服务器和客户端)生成公钥(或密钥[RSA])和私钥

在发送数据之前,您需要使用私钥(仅为您知道)和公钥(两者都知道)对数据进行签名,这将创建一个cypertext(或称为摘要),您可以将其发送到相反的位置人(其他客户或服务器).在另一方面,他们用公钥解密cypertext,然后使用他们的私钥来检索实际数据.

这实际上是使用公共私钥进行加密 – 解密的基础知识.

这些加密和解密的各种版本都可用,做维基百科会很有帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读