php加密解密的用法(对称加密,非对称加密)

加密和摘要的区别
***摘要:是从已知的数据中,通过摘要计算出一个值,一个数据对应一个或多个摘要的值 ***
比如:md5 和 sha1 sha256 hash 就是得到一个特定的值 ,同一个数据得到的md5 是一样的,不会改变的
比如:password_hash 产生的是一个可以变化的摘要,同一个数据每一次生成的都是不一样的结果,当验证的时候可以使用password_verify 来验证是否正确
以下是上面的使用代码

 		$str = "hello huangjunhui";var_dump(md5($str));echo "<br/>";var_dump(hash("md5",$str));echo "<br/>";var_dump(sha1($str));echo "<br/>";var_dump(hash("sha1",$str));echo "<br/>";var_dump(hash("sha256",$str));echo "<br/>";var_dump(hash("sha512",$str));echo "<br/>";

在这里插入图片描述
这里说一下 hash 的用法, hash($algo,$data);
algo是散列的算法, 如果想要查看 hash 可以支持哪些算法, 可以使用 hash_algos() 函数, 得到的数组就是 hash 支持的算法


以上的摘要都是唯一值的, 同样还有一种算法不是唯一值的,比如我们使用的 password_hash 函数

   $str = "hello huangjunhui";$result = password_hash($str,PASSWORD_DEFAULT);//得到加密的结果echo $result."<br/>";  //$2y$10$4sFjS28dGe/DM5MQMQKPp.R.wWWqZYgHJQCHqGjo8vfPPKYrrBzl2//$2y$10$uPBE9MKkJh1r4NSk5VgzduUhrgeMLgnJXzmbghEdh8cK3swnvAXEmecho (int)password_verify($str,$result); //这里是一个布尔值,强转了int

在这里插入图片描述
上面可以看到, 每一次 password_hash的结果都是不一样的, 当验证的时候, 却总是结果为 真,所以这种方法,一般都用在存储用户的密码到数据库,就算数据库丢失,也不会让用户的密码泄漏
上面的几个摘要方法有一个共同点就是 不可逆,也就是说,你想通过密文再获取到原文是不可能的, 所以以上的算法都属于摘要算法


加密解密

能加密解密,就是说,我不仅可以从原文得到密文,也可以从密文在反过来得到原文
主要有两种方式, 一种是对称加密, 一种是非对称加密

php 的加解密用的 openssl_encrypt 和 openssl_decrype
顺便说一句, php之前有一个加密的方法 mcrypt 方法过时了

openssl 的使用注意事项

我在 windows 系统中使用的 openssl , 首先要在 php.ini中打开 openssl的扩展,同时还要找到openssl 的 配置文件(openssl.cnf)的路径,在会使用的时候要指明 openssl.cnf 的路径, 不然会报错
在这里插入图片描述
可以看到,phpinfo中的 openssl 的配置件在 /usr/local/ssl/openssl.cnf 路径中,window 中根本没有这个路径,所以我们在使用 php 的 openssl的时候要在配置中指明配置文件的路径

对称加密,就是加解密过程中,所使用的密钥是一样的

对称加密的算法, 通常有 AES 和 DES 两中,下面我们来看看 PHP 中的对称加密
对称加密通常用于内部的系统, 比如本地的文件加密, 加密时会产生一上 iv向量, 在进行网络传输时, 是要和密文一起传给接收方的, 双方密主要保证 密钥的安全, 不泄漏就可以了
以下是 生成一个密文, 再解密这个密文的代码

//生成一个密文,并返回 密文和iv向量    
public function openssl(){$str = "hello world,huang junhui";   //待加密的字符串$key = openssl_random_pseudo_bytes(16);  //这里相当于就是一个密钥了, 加密和解密时的密码必须是一样的才可以dump(strlen($key)); //int(16)$keybase64 = base64_encode($key);    //因为上一步生成的 key是一个 二进制的数据, 显示出来是乱码, 所在要想显示,就要base64一下$key1 = base64_decode($keybase64);dump($keybase64);dump(strlen($keybase64)); //int(24)$cipher = "AES-128-CBC";  //这里是加密算法的名称  可以使用  openssl_get_cipher_methods() 查看所有支持的加密算法名称$ivLen = openssl_cipher_iv_length($cipher);     //获取算法对应初始化向量的长度$iv = openssl_random_pseudo_bytes($ivLen);  //随机生成一个初始化向量  //这里也可以手写一个长度为 $ivLen 的字符串,此例中$ivLen是16, 所以可以随便写一个 ”sfasfasdfsdfasdf“$encrypted = openssl_encrypt($str,$cipher,$key,OPENSSL_RAW_DATA,$iv);//$encrypted = openssl_encrypt($str,$cipher,$keybase64,OPENSSL_RAW_DATA,"sfasfasdfsdfasdf");  //字符长度必需是16位的 $ivLen的长度//这里使用 $key 和 $keybase64 不影响效果(长度不一样 一个是16一个是24), 也就是说 密钥的长度是可以任意长度的, 只要加密和解密的时侯使用同一个 key就可以了//由于对称加密的特殊性, 当传输数据的时候,是要把iv明文一起传输线接收方的,所以当我们返回给请求方的时候要把 密文加上 $iv 一起传送给前端,又因为$iv是一个二进制数据,所以要base64一下,才可以在网络中传输// dump(base64_encode($encrypted.":".$iv));//接收端接到数据之后,首先base64_decode ,然后使用 ":" 把密文和向量数据分开return base64_encode($encrypted.":::".$iv);//$decrypted = openssl_decrypt($encrypted,$cipher,$key,OPENSSL_RAW_DATA,$iv);//$decrypted = openssl_decrypt($encrypted,$cipher,$keybase64,OPENSSL_RAW_DATA,"sfasfasdfsdfasdf");//dump($decrypted);}//解密密文public function decodeopenssl(){//传入的加密结果 "PDwc77SaX/WcpipdClDx3dYCQBjwWarDswmcwkYKUYU6OjqwKjMwKxcMKU34FYTRhqoj"//加密时使用的 key "XHvcRREJw5vlJKP8AoR39A=="//$base64str = input("secret_content");$str = base64_decode("PDwc77SaX/WcpipdClDx3dYCQBjwWarDswmcwkYKUYU6OjqwKjMwKxcMKU34FYTRhqoj");dump($str);$secretArr = explode(":::",$str);$secretbody = $secretArr[0];$iv = $secretArr[1];$key = base64_decode("XHvcRREJw5vlJKP8AoR39A==");$cipher = "AES-128-CBC";$decrypted = openssl_decrypt($secretbody,$cipher,$key,OPENSSL_RAW_DATA,$iv);dump($decrypted);}

对称加密,是双方都知道密钥的情况下,使用的,最主要的是密钥的安全,iv 明文传输没关系

非对称加密

非对称加密可以用作对数据的加密, 也可以用作对数据的签名;
加密和签名的理解, 加密的时候是 返回给接收方一段无序的数据, 要对方解密才可以使用,签名是, 把原数据给接收方,并在返回的数据中 带上一个由原数据生成的一个签名数据

    public function openssl(){$str = "hello world,huang junhui";   //待加密的字符串//上面说过,在windows中,openssl 的配置文件的路径是要自己找定的  系统默认的路径不是正确的,所以我们要进 配置文的的路径的配置//两种方式, 一种是在系统环境变量中配置  环境变量名:OPENSSL_CONF     变量值 :就是openssl.cnf文件的位置  D:\laragon\bin\apache\httpd-2.4.54-win64-VS16\conf\openssl.cnf//另一种方式,在config数组中配置 "config" =>"D:\laragon\bin\apache\httpd-2.4.54-win64-VS16\conf\openssl.cnf" , 注意config 的结构$config = ["config"=>"D:\laragon\bin\apache\httpd-2.4.54-win64-VS16\conf\openssl.cnf","digest_alg" => "sha512",           //摘要算法或签名的算法  非必填"private_key_bits" => 2048,         //私钥的长度  512  1024  2048  4096 通常选1024或2048"private_key_type" => OPENSSL_KEYTYPE_RSA,      //加密类型  通常可以选择OPENSSL_KEYTYPE_DSA、 OPENSSL_KEYTYPE_DH、 OPENSSL_KEYTYPE_RSA 或 OPENSSL_KEYTYPE_EC。 默认值是 OPENSSL_KEYTYPE_RSA。];//创建私钥和公钥资源$res = openssl_pkey_new($config);     //注意这里是一个包含了公私钥的资源//资源中获取私钥      公私钥资源      生成的私钥       第三个参数是可以加一些盐值   第四个参数是 上面的配置项openssl_pkey_export($res, $private_key, null, $config);//dump($private_key);//从资源中获取公钥数组信息$public_key_arr = openssl_pkey_get_details($res);$public_key = $public_key_arr["key"];dump($public_key);//这样我们就生成了一对公私钥, 我们可以把每个生成的公私钥保存到数据库,得到一个数据库的编号,然后把公钥数据传给请求方,请求方使用公钥加密数据之后, 再返回给服务器, 服务器使用私钥解密//签名 //签名是用公钥签名,使用私钥来验证签名openssl_sign($str,$sign,$private_key,OPENSSL_ALGO_SHA1);dump(openssl_verify($str,$sign,$public_key,OPENSSL_ALGO_SHA1));//有了上面的公钥,我们就可以用来加密、openssl_public_encrypt($str,$encrypted_data,$public_key);dump($encrypted_data);//解密数据openssl_private_decrypt($encrypted_data,$decrypted_data,$private_key);dump($decrypted_data);}

以上就是openssl 的用法


下面是一个 封装的 RSA 类 , 可以做参考

<?php/*** RSA签名类*/
class Rsa
{public $publicKey = '';public $privateKey = '';private $_privKey;/*** * private key*/private $_pubKey;/*** * public key*/private $_keyPath;/*** * the keys saving path*//*** * the construtor,the param $path is the keys saving path* @param string $publicKey  公钥* @param string $privateKey 私钥*/public function __construct($publicKey = null, $privateKey = null){$this->setKey($publicKey, $privateKey);}/*** 设置公钥和私钥* @param string $publicKey  公钥* @param string $privateKey 私钥*/public function setKey($publicKey = null, $privateKey = null){if (!is_null($publicKey)) {$this->publicKey = $publicKey;}if (!is_null($privateKey)) {$this->privateKey = $privateKey;}}/*** * setup the private key*/private function setupPrivKey(){if (is_resource($this->_privKey)) {return true;}$pem = chunk_split($this->privateKey, 64, "\n");$pem = "-----BEGIN PRIVATE KEY-----\n" . $pem . "-----END PRIVATE KEY-----\n";$this->_privKey = openssl_pkey_get_private($pem);return true;}/*** * setup the public key*/private function setupPubKey(){if (is_resource($this->_pubKey)) {return true;}$pem = chunk_split($this->publicKey, 64, "\n");$pem = "-----BEGIN PUBLIC KEY-----\n" . $pem . "-----END PUBLIC KEY-----\n";$this->_pubKey = openssl_pkey_get_public($pem);return true;}/*** * encrypt with the private key*/public function privEncrypt($data){if (!is_string($data)) {return null;}$this->setupPrivKey();$r = openssl_private_encrypt($data, $encrypted, $this->_privKey);if ($r) {return base64_encode($encrypted);}return null;}/*** * decrypt with the private key*/public function privDecrypt($encrypted){if (!is_string($encrypted)) {return null;}$this->setupPrivKey();$encrypted = base64_decode($encrypted);$r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);if ($r) {return $decrypted;}return null;}/*** * encrypt with public key*/public function pubEncrypt($data){if (!is_string($data)) {return null;}$this->setupPubKey();$r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);if ($r) {return base64_encode($encrypted);}return null;}/*** * decrypt with the public key*/public function pubDecrypt($crypted){if (!is_string($crypted)) {return null;}$this->setupPubKey();$crypted = base64_decode($crypted);$r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);if ($r) {return $decrypted;}return null;}/*** 构造签名* @param string $dataString 被签名数据* @return string*/public function sign($dataString){$this->setupPrivKey();$signature = false;openssl_sign($dataString, $signature, $this->_privKey);return base64_encode($signature);}/*** 验证签名* @param string $dataString 被签名数据* @param string $signString 已经签名的字符串* @return number 1签名正确 0签名错误*/public function verify($dataString, $signString){$this->setupPubKey();$signature = base64_decode($signString);$flg = openssl_verify($dataString, $signature, $this->_pubKey);return $flg;}public function __destruct(){is_resource($this->_privKey) && @openssl_free_key($this->_privKey);is_resource($this->_pubKey) && @openssl_free_key($this->_pubKey);}
}
$publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZ1mKTymRoGKnHiP1xAy4aiyt5r0BscCZnDAonCrMFZ4kBGriPNHxEaLr5lfBnMKw7k6i+2dsFPSEZooTvqtPUCAwEAAQ==';
$privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApnWYpPKZGgYqceI/XEDLhqLK3mvQGxwJmcMCicKswVniQEauI80fERouvmV8GcwrDuTqL7Z2wU9IRmihO+q09QIDAQABAkBunx3nGHXYjppsfn++7iyTd+I7+Agfy/0xWyB3rpEiGGgfemjcRFaeq5SC2vUNXsrEOY5gbUSQmFxH//Cym18NAiEA1z1cZx/Q9cbIjFPwp1a+K5CVFDXDcfbi/AQgAkVs0/cCIQDF+2fr23AoBslcOC4S0yAx94AbgxCntYuRqztxybsrcwIgMW86ZcT87TX2oaQ1xXk6vC68zqN6fBZEE7Wu1Fa1pAkCIElmOJP3qfAc/AAlj+dIwLHlqWgJwl3674CU9Bfui2bDAiEA0CKJpF8x7KANCcopEQC93PsbIztuML322LOfDV1Lw/k=';
$rsa=new Rsa($publicKey,$privateKey);
$str="abc";
echo "原始数据:".$str;
echo "<br/><hr>";
$res=$rsa->privEncrypt($str);
echo "私钥加密数据:".$res;
echo "<br/>";$res2=$rsa->pubDecrypt($res);
echo "公钥解密数据:".$res2;
echo "<br/><hr>";$res3=$rsa->pubEncrypt($str);
echo "公钥加密数据:".$res3;
echo "<br/>";$res4=$rsa->privDecrypt($res3);
echo "私钥解密数据:".$res4;
echo "<br/><hr>";echo "签名数据:".$str;
$res5=$rsa->sign($str);
echo "<br/>";
echo "签名结果:".$res5;
$res6=$rsa->verify($str,$res5);
echo "<br/>";
echo "验证签结果:".$res6;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/184518.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】气象卫星监测AR互动教学软件为气象学习带来更多乐趣

由VR制作公司广州华锐互动开发的气象卫星监测AR互动教学软件是一款结合了增强现实(AR)技术与气象监测技术的教育软件。它通过直观、互动的方式&#xff0c;帮助学生更好地理解和掌握气象监测的基本知识和技能。本文将从气象卫星监测AR互动教学软件的应用场景、优势分析、实际意…

智安网络|探索人机交互的未来:自然语言处理的前沿技术

自然语言处理是人工智能领域中研究人类语言和计算机之间交互的一门学科。它涉及了语言的理解、生成、翻译、分类和摘要等多个方面。随着人们对自然语言处理的重视和需求不断增长&#xff0c;成为了热门的研究方向。 首先&#xff0c;我们需要了解自然语言处理的基本概念。自然…

网络安全-零基础小白自学要点

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

【网络管理——操作系统与安全】

文章目录 一、安装WindowsServer操作系统1、新建虚拟机2、进入Windows虚拟机进行相关配置 二、Windows用户账户管理与配置1、创建用户账户2、创建用户组 三、Windows操作系统的本地安全策略设置1、配置用户账户密码策略2、配置用户账户锁定策略3、配置组策略安全选项4、配置审核…

CVE-2023-0179-Nftables整型溢出

前言 Netfilter是一个用于Linux操作系统的网络数据包过滤框架&#xff0c;它提供了一种灵活的方式来管理网络数据包的流动。Netfilter允许系统管理员和开发人员控制数据包在Linux内核中的处理方式&#xff0c;以实现网络安全、网络地址转换&#xff08;Network Address Transl…

OmniFocus Pro for Mac(GTD时间管理软件) OmniFocus Mac版

OmniFocus Pro 3 for Mac 中文激活版是一款功能强大且灵活的 GTD 时间管理工具&#xff0c;可为您提供无干扰的环境&#xff0c;帮助您可以轻松地从邮件&#xff0c;消息&#xff0c;Safari 和任何其他第三方应用程序中安排任务&#xff0c;编写备注和剪辑信息。您可以快速轻松…

Intel oneAPI笔记(4)--jupyter官方文档(Unified Shared Memory)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/03_Unified_Shared_Memory文档的学习记录&#xff0c;主要包含对统一共享内存的讲解 USM概述 USM (Unified Shared Memory)是SYCL中基于指针的内存管理。对于使用malloc或new来分配数据的C和C程序员来说应该很熟悉。当将现有的C…

Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出

本心、输入输出、结果 文章目录 Apple &#xff1a;苹果将在明年年底推出自己的 AI&#xff0c;预计将随 iOS 18 一起推出前言三星声称库克相关图片弘扬爱国精神 Apple &#xff1a;苹果将在明年年底推出自己的 AI&#xff0c;预计将随 iOS 18 一起推出 编辑&#xff1a;简简单…

论文阅读:Ensemble Knowledge Transfer for Semantic Segmentation

论文地址&#xff1a;https://ieeexplore.ieee.org/document/8354272 项目及数据地址&#xff1a;https://github.com/ishann/aeroscapes 发表时间&#xff1a;2018年5月7日 语义分割网络通常以严格监督的方式学习&#xff0c;即它们在相似的数据分布上进行训练和测试。在域转…

电机应用-舵机

目录 舵机 分类 结构 工作原理 控制原理 参数 舵机基本控制实验&#xff08;MG996R舵机&#xff09; MG996R舵机规格 硬件电路 TIM4配置 测试环节 舵机 分类 按照舵机的控制电路分类&#xff1a;模拟舵机和数字舵机。 模拟舵机和数字舵机的机械结构是完全相同的。 …

基于ssm的校园快递物流管理系统(java+jsp+ssm+javabean+mysql+tomcat)

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;9.9拿走&#xff01; 基于javawebmysql的ssm校园快递物流管理系统(javajspssmjavabeanmysqltomcat) 运行环境&#xff1a; Java≥8、MySQL≥5.7、Tomcat≥8 开发工具&#xff1a; eclipse/idea/myeclipse/s…

【C++】STL 标准模板库 ① ( STL 简介 | STL 基本概念 | STL 主要内容 )

文章目录 一、STL 简介1、STL 概念2、STL 主要内容 二、STL 代码示例 一、STL 简介 1、STL 概念 C 语言 的 STL " 标准模板库 " 英文全称 " Standard Template Library " , STL 是一套强大的 C 库 , 其中包含了各种通用的 数据结构和算法 , 如 : 向量、列…

谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段

本心、输入输出、结果 文章目录 谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段前言谷歌 DeepMind 发布 AGI 分级框架发展 AGI 必须遵循6个基本原则什么是AGI图灵测试详解六大原则AGI 的五大发展过程阶段原文参考弘扬爱国精神谷歌提出 AGI 完整路线图:目前 Cha…

Redis系列-四种部署方式-单机部署+主从模式+哨兵模式【7】

目录 Redis系列-四种部署方式-单机部署主从模式【7】redis-四种部署模式单机模式主从模式数据同步的方式全量数据同步增量数据同步 Redis哨兵模式总结缺点&#xff1a;哨兵模式应用sentinel.conf配置项 REF 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持…

VScode连接Xshell 并解决【过程试图写入的管道不存在】报错

一.下载vscode 国内镜像&#xff1a; https://vscode.cdn.azure.cn/stable/6c3e3dba23e8fadc360aed75ce363ba185c49794/VSCodeUserSetup-x64-1.81.1.exe二.打开vscode在扩展搜索SSH并安装 三.添加主机 按F1选择添加新的ssh主机 按格式输入后在左边会出现电视的图标 之后输入…

优先级队列(堆)的概念+模拟堆的实现

文章目录 优先级队列&#xff08;堆&#xff09;的概念模拟堆的实现一、概念1.优先级队列2.堆1.堆的性质2.堆的存储3.堆的创建3.1 向下调整3.2建堆的时间复杂度 O(N) 4.堆的插入4.1向上调整4.2向上调整建堆的时间复杂度&#xff1a;O(N * log N) 5.堆的删除 优先级队列&#xf…

前端使用firebase配置第三方登录介绍(谷歌登录,facebook登录等)

参考文档 点此处去 firebase 官网点此处去 web端的谷歌登录文档点此处去 facebook开发者官网链接 实现&#xff08;谷歌登录&#xff09; 首先注册一个账号登录firebase&#xff08;可以使用谷歌账号登录&#xff09;然后创建项目&#xff08;走默认配置就行了&#xff09; …

什么是超级托斯卡纳葡萄酒?

超级托斯卡纳葡萄酒通常被认为是在托斯卡纳用国际葡萄品种制成的葡萄酒&#xff0c;如赤霞珠、品丽珠或梅洛&#xff0c;而不是传统的托斯卡纳葡萄桑娇维塞。来自云仓酒庄品牌雷盛红酒分享这些葡萄酒可能包含一些桑娇维塞&#xff0c;但这通常不是混合中的主要葡萄。这些大胆的…

FMCW雷达论文速览 | TRS 2023, 基于FMCW雷达的多天线高精度测距算法及性能分析

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 TRS 2023 | High Accuracy Multi-antenna Ranging Algorithm and Performance Analysis for FMCW Radar 论文原文:https://ieeexplore.ieee.org/document/10309162 Z. Xu, S. Qi and P. Zh…

制药企业如何提高员工的GMP合规意识

在上期的文章中&#xff0c;我们介绍了>>制药企业计算机化系统验证(CSV)的重要性&#xff0c;本期我们深入探讨制药企业如何培养员工形成GMP良好的合规意识。 良好的药品质量是保障患者安全和有效治疗的基石。为了确保药品的质量、安全性和一致性&#xff0c;制药企业必…