php中加密和解密
项目要和第三方进行接口对接,所以数据的安全很重要。第一次自己设计并实现,学习记录下
网上查了很多资料,真的很深奥
对称加密:
双方共用一个约定好的密钥进行数据的加密和解密,但是当密匙丢失,数据将有泄露风险。
实例:
$input_str = '阿达854aa';
echo '被加密的字符串:'.$input_str.'<br>';
$key = '159';
$iv = '1234567812345678';//须是16位
$encrypted = openssl_encrypt($input_str, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
echo '加密后的字符串:'.$encrypted.'<br>';
$data = base64_encode($encrypted);
echo '加密编码后的字符串:'.$data.'<br>';
$de_data = base64_decode($data);
echo '加密解码后的字符串:'.$de_data.'<br>';
$decrypted = openssl_decrypt($de_data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
echo '解密后的字符串:'.$decrypted.'<br>';
输出:
被加密的字符串:阿达854aa
加密后的字符串:���=8�++�-���
加密编码后的字符串:qqT4PTiJKyv/LRmng4UGBA==
加密解码后的字符串:���=8�++�-���
解密后的字符串:阿达854aa
其中:
‘aes-128-cbc’是一种加密方法,可以使用openssl_get_cipher_methods()获取到。$key加密密钥,须和解密密钥一致。$iv密码初始化向量(16位)。
非对称加密:
即双方使用不一样的密钥进行加密、解密,也就是公钥、私钥。届时,私钥加密的数据公钥可以解密。但是,公钥加密的数据只有私钥才可以解密。所以只要私钥保存完好,公钥丢失也不会影响数据的安全性。这种方式在网站上很常见,例如https传输
具体实现:
首先要生成一对密钥 http://www.bm8.com.cn/webtool/rsa/
加密解密类库:
<?php
class Rsa {
/**
* 获取私钥
* @return bool|resource
*/
private static function getPrivateKey()
{
$abs_path = dirname(__FILE__) . '/rsa_private_key.pem';
$content = file_get_contents($abs_path);
return openssl_pkey_get_private($content);
}
/**
* 获取公钥
* @return bool|resource
*/
private static function getPublicKey()
{
$abs_path = dirname(__FILE__) . '/rsa_public_key.pem';
$content = file_get_contents($abs_path);
return openssl_pkey_get_public($content);
}
/**
* 私钥加密
* @param string $data
* @return null|string
*/
public static function privEncrypt($data = '')
{
if (!is_string($data)) {
return null;
}
return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null;
}
/**
* 公钥加密
* @param string $data
* @return null|string
*/
public static function publicEncrypt($data = '')
{
if (!is_string($data)) {
return null;
}
return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null;
}
/**
* 私钥解密
* @param string $encrypted
* @return null
*/
public static function privDecrypt($encrypted = '')
{
if (!is_string($encrypted)) {
return null;
}
return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null;
}
/**
* 公钥解密
* @param string $encrypted
* @return null
*/
public static function publicDecrypt($encrypted = '')
{
if (!is_string($encrypted)) {
return null;
}
return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;
}
}
调用demo:
require_once "Rsa.php";
$rsa = new Rsa();
$data['name'] = 'Tom';
$data['age'] = '20';
$privEncrypt = $rsa->privEncrypt(json_encode($data));
echo '私钥加密后:'.$privEncrypt.'<br>'; $publicDecrypt = $rsa->publicDecrypt($privEncrypt);
echo '公钥解密后:'.$publicDecrypt.'<br>'; $publicEncrypt = $rsa->publicEncrypt(json_encode($data));
echo '公钥加密后:'.$publicEncrypt.'<br>'; $privDecrypt = $rsa->privDecrypt($publicEncrypt);
echo '私钥解密后:'.$privDecrypt.'<br>';
输出:
私钥加密后:QwOppsd++LHg84d+d4ygfWRnEUFQhO63COVEE860p+U60EpuUBXlOX1W2ogLStNtOKWGfvNux6QETFG/iX8aL3ffWt+kPcxIpmvhCWlhfk6WI89CEaznGiumqgvwN7XMvQvPWs8LpQO9Cbhh5vxxTOJ5fbduzmpcPGQiFWEUzqw=
公钥解密后:{"name":"Tom","age":"20"}
公钥加密后:hoAK18Dlh+xrRh1fJHnbNiVYxB/j410MeMcHYP+BLCL4g47iMosPLVnOjzAr+wWMgXW9S8nrs3fsWJ0lkm4l6/BT9c5nBt2DjmE4W8H7shCHPw/fj1Yy3B9t9Z8MUfegxqdSEsROKTQ2hFmsz8oPhMcZRAek7x8qHWBomsUqtBk=
私钥解密后:{"name":"Tom","age":"20"}
先这样吧,将项目搞起来,以后再研究吧。先知道原理就可以了,至于具体为什么这么实现的,哈哈,不懂不懂,有心学但没那个力啊,深奥深奥
推荐几篇不错的加解密博文:
https://t.ti-node.com/thread/6497068236977209344
https://t.ti-node.com/thread/6497352274560417793
https://t.ti-node.com/thread/6497394198361145345
https://t.ti-node.com/thread/6499999246572322817
php中加密和解密的更多相关文章
- 浅谈.NET中加密和解密的实现方法分享
这篇文章介绍了.NET中加密和解密的实现方法,有需要的朋友可以参考一下 .NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利.它将CryptoAPI改编进.NET的Syste ...
- .net中加密与解密
.Net中的加密解密 引言 在一些比较重要的应用场景中,通过网络传递数据需要进行加密以保证安全.本文将简单地介绍了加密解密的一些概念,以及相关的数字签名.证书,最后介绍了如何在.NET中对数据进行对称 ...
- (译)利用ASP.NET加密和解密Web.config中连接字符串
介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...
- 利用ASP.NET加密和解密Web.config中连接字符串
摘自:博客园 介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Se ...
- 在ASP.NET MVC环境中使用加密与解密
在.NET Framework 4.5的NET框架中,在程序中加密与解密很方便.现在均学习ASP.NET MVC程序了,因此Insus.NET也在此写个学习的例子.在需要时可以参考与查阅. 写一个Ut ...
- (转)DES、RSA、MD5、SHA、随机生成加密与解密
一.数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1.常用密钥算法 密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括: DES(Data Encr ...
- url加密和解密
.NET中加密和解密有两种方式 string file="文件上(传)篇.doc";string Server_UrlEncode=Server.UrlEncode(file);s ...
- Web开发之编码与解码、签名、加密与解密
在Web开发中,编码与解码.签名.加密与解密是非常常见的问题.本文不会介绍具体实例,而是介绍这些的原理.用途与区别.一.编码与解码 在Web开发中,需要通过URL的query参数来传递数 ...
- Java加密与解密的艺术 读书心得
现在项目中加密与解密的方式很多,很早就想整理一下Java中加密与解密的方式,读完<<Java加密与解密的艺术>>一书.借此机会梳理一下这方面的知识点 一.基础普及 安全技术目标 ...
随机推荐
- hibernate一对多映射文件的配置
其中一个Customer对应多个LinkMan Customer的映射文件 Customer.hbm.xml-------------->一对多 <?xml version="1 ...
- luogu3391
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- 洛谷 P2151 [SDOI2009]HH去散步
题目链接 思路 如果没有不能走上一条边的限制,很显然就是dp. 设f[i][j]表示到达i点走了j步的方案数,移到k点可以表示为f[k][j+1]+=f[i][j]. 如果有限制的话,可以考虑用边表示 ...
- NAND闪存供过于求的情况今年会有所好转吗?
2018年,NAND闪存全年供过于求,价格一直下跌,导致西数.东芝等厂商毛利率大幅下滑.如今到了2019年,情况会有所好转吗? 近日,集邦科技旗下半导体研究中心DRAMeXchange发布调查报告指出 ...
- 源码分析: 图片加载框架Picasso源码分析
使用: Picasso.with(this) .load("http://imgstore.cdn.sogou.com/app/a/100540002/467502.jpg") . ...
- ContOS安装配置MySQL,redis
MySQL(MariaDB) 一,说明 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MyS ...
- CSS初步学习
1.选择器: 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器. id 选择器 id 选择器可以为标有特定 id 的 ...
- Django+Xadmin打造在线教育系统(二)
基于xadmin的后台管理 先使用pip进行安装xadmin及其依赖包 pip install django-adminx 安装完成后卸载xadmin,保留依赖包即可 pip uninstall dj ...
- 爬虫_古诗文网(队列,多线程,锁,正则,xpath)
import requests from queue import Queue import threading from lxml import etree import re import c ...
- 【AtCoder - 2300】Snuke Line(树状数组)
BUPT2017 wintertraining(15) #9A 题意 有n个纪念品,购买区间是\([l_i,r_i]\).求每i(1-m)站停一次,可以买到多少纪念品. 题解 每隔d站停一次的列车,一 ...