您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP如何使用OpenSSL加密中的非对称加密

2024/3/20 1:27:51发布25次查看
本篇文章给大家介绍一下php使用openssl加密中非对称加密的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
上篇文章,我们了解了关于对称和非对称加密的一些相关的理论知识,也学习了使用 openssl 来进行对称加密的操作。今天,我们就更进一步,学习 openssl 中的非对称加密是如何实现的。
生成私钥通过之前的学习,我们知道非对称加密是分别需要一个公钥和一个私钥的。我们就先来生成一个私钥,也就是存放在我们这一端一个密钥。请记住,在任何时候,私钥都是不能给别人的哦!
$config = array( "private_key_bits" => 4096, // 指定应该使用多少位来生成私钥);$res = openssl_pkey_new($config); // 根据配置信息生成私钥openssl_pkey_export($res, $privatekey); // 将一个密钥的可输出表示转换为字符串var_dump($privatekey); // -----begin private key-----// miijqgibadanbgkqhkig9w0baqefaasccswwggkoageaaoicaqdfmlw+9t3fnx4c// ybuv0ilsypadsyvxte4clv32ovnk9yqzgf2nl/zuibbgrcyo2hf5b31dografdgu// notr+wa7cbjkrofr/+yvalsmfieikntttwmkmbciysdjoeoyd6wjdd+kchqdojvo// ……// -----end private key-----
非常简单的一个函数 openssl_pkey_new() ,它接收一个参数,这个参数是可配置项并且是可选参数。生成的结果是一个私钥句柄,不是我们能直接读取的内容,所以我们再使用 openssl_pkey_export() 来提取可输出的字符串。
注释中的内容就是我们生成的私钥信息了,私钥信息一般会相对多些,所以省略了后面的内容。
抽取公钥接下来就是生成公钥了,其实,公钥是从私钥中抽取出来的。所以我们使用进行加解密的时候,都可以使用私钥或者公钥互相操作。
$publickey = openssl_pkey_get_details($res); // 抽取公钥信息var_dump($publickey);// array(4) {// ["bits"]=>// int(4096)// ["key"]=>// string(800) "-----begin public key-----// miicijanbgkqhkig9w0baqefaaocag8amiiccgkcageatoiimdds0w0var5ra1+e// hr2ajwqqwxntykgtku8emjrbx2vu+x8th8w8snogivm/soitg0hie4egf1uxozht// gi6r+jpap7jbtn0sd/vtpde09f21+hfgjivbqrkclpjuebf7+tjmgax8cg8wlgid// g8hsub70krankje1bcxibuggrfk0sqgllxa/hxig5wanqhtrdpjgjba+ahsi2+4h// uwnycv1o3aapyz6a12hnusg4eio/twv/hob9pot6naqwphuibhp56i5bv1ijmjzm// jwren5f/kwdz01ig2fi0ubotr2y/eeaus7xbypf/ggzz/um7cnuxcdyg5ylum/4r// mev4mspmvgb72izited+c6cqftxl98ibfrdc+pisfbrsgou/hsubhkkm5syzyi3i// ypaej25++qlpqca+edr3jndhnz0gohofcrtpq4dsr7illlrnz0tnhiye9wabmo49// uthabnbkm54bg+omofy4bkn5n39ckpelbhiixgod+la684xus/2aw3dvelc9gbag// oifvb/wljpysd0zmd64cxbptwbfwxc8k4vckvfljytcz2yp4t6fvjblt5ra6u8su// e0wwe4qtfnkhnm5ovfimn+nmc3y/esvfcin3eyvotdz4n6tt45dkybkf6aqe3scg// e/jblieea+gjgtvey4cnuiecaweaaq==// -----end public key-----// "// ["rsa"]=>// ……$publickey = $publickey['key'];
使用 openssl_pkey_get_details() 抽取出来的内容包含很多内容。不过我们所需要的最主要的内容就是 key 下面的这个公钥。
大家再回过头来好好看一下公钥和私钥的内容,是不是和我们去申请的 https 证书中的公私钥内容长得一样,而且也和我们自己在系统中使用 openssl 命令行生成的本机的密钥证书一样。它们本身就是一样的东西啦,只是在不同的场景应用的不同而已。https 证书除了非对称加密的密钥之外,还包含有 ca 信息,如果 ca 不通过,浏览器也会认为证书是无效的,因此,我们使用自己生成的证书来充当 https 证书是不可以的。而本身生成的一般会用在 ssh 免密登录上,或者是 github 的免密代码仓库操作上。
加密解密数据好了,公钥和私钥都生成完成了,那么我们就要进行最重要的加密和解密操作了。
$data = '测试非对称加密';// 公钥加密数据openssl_public_encrypt($data, $encrypted, $publickey);var_dump($encrypted);// string(512) // 私钥解密数据openssl_private_decrypt($encrypted, $decrypted, $privatekey);var_dump($decrypted);// string(21) "测试非对称加密"
在这里,我们使用的就是最标准的公钥加密,私钥解密来进行的测试。其实反过来也是可以的,openssl 分别都为我们提供了公钥的加解密和私钥的加解密函数。
就像上篇文章的图示那样,对方获得我们的公钥,然后加密数据传输过来,我们通过自己的私钥解密数据获得原文。而我方也可以获得对方的公钥,并将返回的数据加密后传输给对方,然后对方使用自己的私钥进行解密获得我们传递给它的原文数据。
而 https 是通过 ca 颁发的证书来获取公钥的,浏览器通过公钥加密请求数据传输给服务器,服务器也是通过相同的原理来向浏览器客户端发送密文数据。因此,在数据传输过程中,使用 https 的传输会更加地安全,即使被截获了,对方也没有证书提供的密钥来进行解密。这就是现在所有 app 和 小程序 应用都要求使用 https 的原因,当然,我们如果做网站开发也最好使用 https ,就连百度对 https 的收录也有相应的调整。
签名及验证接下来我们再接触一个签名的概念。当两端进行通信时,我们怎么知道当前传输过来的数据一定是对端发送过来的的呢,中间有没有黑客进行了篡改呢?这个就可以通过签名机制来进行验证。
// 利用私钥生成签名openssl_sign($data, $signature, $privatekey, openssl_algo_sha256);var_dump($signature);// 公钥验证签名$r = openssl_verify($data, $signature, $publickey, openssl_algo_sha256);var_dump($r);// int(1)
我们通过 openssl_sign() 来生成一个对原始数据的私钥签名,然后就可以使用 openssl_verify() 通过公钥验证数据签名是否一致。
在使用的时候,发送方通过自己的私钥生成签名,由于签名内容是乱码的,我们可以将它 base64_encode() 一下,然后连同加密数据一起传递给接收方。然后接收方使用公钥并根据签名内容来验证原文数据是否被篡改过。
// 发送方签名$resquestsign = base64_encode($signature);// 假设通过网络请求发送了数据// ……// 接收到获得签名及原始数据// $signature = $_post['sign'];// openssl_private_decrypt($_post['data'], $data, $privatekey); $responsesign = base64_decode($signature);// 验证数据有没有被篡改$r = openssl_verify($data, $signature, $publickey, openssl_algo_sha256);var_dump($r);// int(1)// 假设被篡改$data = '我被修改了';$r = openssl_verify($data, $signature, $publickey, openssl_algo_sha256);var_dump($r);// int(0)
总结今天的内容是不是感觉比对称加密复杂了许多。特别新引入的签名的这个概念,其实很多证书相关的内容都会和数据签名有关系。也就是说,看似简单的一个 https ,其实浏览器和服务端的 openssl 帮我们做了很多事情,远不止你去 ca 申请一套证书然后在 nginx 配好那么简单。那么,接下来,我们将要学习的就是生成证书相关的内容了,系好安全带,车还要继续飙。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/php%e7%9a%84openssl%e5%8a%a0%e5%af%86%e6%89%a9%e5%b1%95%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%ba%8c%ef%bc%89%ef%bc%9a%e9%9d%9e%e5%af%b9%e7%a7%b0%e5%8a%a0%e5%af%86.php
推荐学习:php视频教程
以上就是php如何使用openssl加密中的非对称加密的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product