项目要和第三方进行接口对接,所以数据的安全很重要。第一次自己设计并实现,学习记录下

网上查了很多资料,真的很深奥

对称加密:

  双方共用一个约定好的密钥进行数据的加密和解密,但是当密匙丢失,数据将有泄露风险。

实例:

$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中加密和解密的更多相关文章

  1. 浅谈.NET中加密和解密的实现方法分享

    这篇文章介绍了.NET中加密和解密的实现方法,有需要的朋友可以参考一下 .NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利.它将CryptoAPI改编进.NET的Syste ...

  2. .net中加密与解密

    .Net中的加密解密 引言 在一些比较重要的应用场景中,通过网络传递数据需要进行加密以保证安全.本文将简单地介绍了加密解密的一些概念,以及相关的数字签名.证书,最后介绍了如何在.NET中对数据进行对称 ...

  3. (译)利用ASP.NET加密和解密Web.config中连接字符串

    介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...

  4. 利用ASP.NET加密和解密Web.config中连接字符串

    摘自:博客园 介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Se ...

  5. 在ASP.NET MVC环境中使用加密与解密

    在.NET Framework 4.5的NET框架中,在程序中加密与解密很方便.现在均学习ASP.NET MVC程序了,因此Insus.NET也在此写个学习的例子.在需要时可以参考与查阅. 写一个Ut ...

  6. (转)DES、RSA、MD5、SHA、随机生成加密与解密

    一.数据加密/编码算法列表   常见用于保证安全的加密或编码算法如下:   1.常用密钥算法   密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括:   DES(Data Encr ...

  7. url加密和解密

    .NET中加密和解密有两种方式 string file="文件上(传)篇.doc";string Server_UrlEncode=Server.UrlEncode(file);s ...

  8. Web开发之编码与解码、签名、加密与解密

    在Web开发中,编码与解码.签名.加密与解密是非常常见的问题.本文不会介绍具体实例,而是介绍这些的原理.用途与区别.一.编码与解码        在Web开发中,需要通过URL的query参数来传递数 ...

  9. Java加密与解密的艺术 读书心得

    现在项目中加密与解密的方式很多,很早就想整理一下Java中加密与解密的方式,读完<<Java加密与解密的艺术>>一书.借此机会梳理一下这方面的知识点 一.基础普及 安全技术目标 ...

随机推荐

  1. sql中的begin catch 。。。end catch 的用法

    begin catch ...end  catch 是用来处理异常的 begintry--SQLendtry begincatch--sql (处理出错动作)endcatch 我们将可能会出错的sql ...

  2. 安装使用nginx

    nginx的优势 是c语言开发的一个web框架 官方声称支持10W+的并发 天下武功 唯快不破 tengine+ uwsgi(多进程) + django 你公司的技术栈是什么样? centos7 + ...

  3. 欧拉筛法模板&&P3383 【模板】线性筛素数

    我们先来看欧拉筛法 •为什么叫欧拉筛呢?这可能是跟欧拉有关 •但是为什么叫线性筛呢?因为它的复杂度是线性的,也就是O(n),我们直接来看代码   #include<cstdio> #inc ...

  4. IDEA 根据 Mysql 自动生成

    1 找到 没有的,file--project structure--modules--+--JPA 2  找到如下 添加Mysql连接,记得 Text Connecting一下看看 然后刷新,就可以出 ...

  5. 【XSY2731】Div 数论 杜教筛 莫比乌斯反演

    题目大意 定义复数\(a+bi\)为整数\(k\)的约数,当且仅当\(a\)和\(b\)为整数且存在整数\(c\)和\(d\)满足\((a+bi)(c+di)=k\). 定义复数\(a+bi\)的实部 ...

  6. 【XSY1081】随机存储器 网络流

    题目描述 Bob有\(2^n\)字节的内存,编号为\([0,2^n-1)\).他想对每个字节的内存分别分配一个值.对于编号为\(i\)的内存,如果它被分配了一个值\(j(0\leq j<2^m) ...

  7. wstngfw IKEv2服务器配置示例

    wstngfw IKEv2服务器配置示例 移动客户端的服务器配置有几个组件: 为***创建一个证书结构 配置IPsec移动客户端设置 为客户端连接创建阶段1和阶段2 添加IPsec防火墙规则 创建** ...

  8. MT【292】任意存在求最值

    已知向量$\textbf{a},\textbf{b}$满足:$|\textbf{a}|=|\textbf{b}|=1,\textbf{a}\cdot\textbf{b}=\dfrac{1}{2},\t ...

  9. 「浙大ACM」图森未来杯游记一篇以及简易口胡题解

    前言 蒟蒻有参加了ACM比赛,这一次有适合HY和慕容宝宝大佬一起比的,他们好巨啊,把我带飞了. 又是窝掌机,QAQ,他们仗着自己巨,就欺负窝... 我又打了\(4\)个小时的代码,而且那个键盘太恶心了 ...

  10. Python面试指南

    1.Python基本语法 1.@staticmethod 和 @classmethod Python中有三种方法,实例方法.类方法(@classmethod).静态方法(@staticmethod). ...