博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP开发日志 ━━ jsrsasign、jsencrypt、php实现前后端数据的RSA加密和解密
阅读量:4116 次
发布时间:2019-05-25

本文共 2557 字,大约阅读时间需要 8 分钟。

按照等保要求,密码类的信息必须经过RSA加密后才能传递:

需要对密码传输过程中进行加密方式传输。

如采用md5加验或SM1、SM2、SM4、3DES、AES、RSA加密算法,
同时也不要直接采用暴露在互联网上的md5、base64算法、URL编码转换。

虽然仅仅用base64来加密已被禁止,但是思路还是一样的:“客户端使用js加密服务端使用php解密”。

比较两个客户端js插件:

jsencrypt.jsjsrsasign.js 都可以实现加密解密,但 jsencrypt.js 更方便, jsrsasign.js 更全面;

jsencrypt.js 加密后就已经是 base64格式 ,而 jsrsasign 需要分两步分别实现 RSA加密base64编码

好了,话不多说,言归正传。

一、原理

RSA基本原理就是客户端上有一把公钥,服务器上有一把私钥,这两把钥匙长相不同,但有着不可思议的数学关系,能互相识别对方。

客户端传递信息前,先利用公钥把信息加密(加密过程有随机数参与,所以每次结果都不同),到达后,服务端利用私钥再把信息解密还原成原信息。

正是由于公私两把钥不一样,甚至其中一把是外人所不知的,所以这种加密方式也叫“非对称加密”。

实际使用时把公钥对外公布,可以由很多客户端拥有,而私钥只限服务端,这样由于没有私钥,即便客户端传递数据时被人拦截,那这些被拦截的数据也是无法解密的。

为了进一步提高安全性,还可以加入签名,这里就不赘述了。

参考学习

《》
《》


二、配置

配置并获得公钥和私钥。

  • 下载加密插件
    二选一即可。
  1. jsencrypt.js

    地址:,解压后将其中jsencrypt.min.js安装到指定目录。

  2. jsrsasign.js

    地址:,解压后将其中jsrsasign-all-min.js安装到指定目录。

  • 配置服务器php.ini

    去掉 ; ,激活extension=openssl

  • 获取公私密钥

    二选一即可

  1. 文件生成的方法:《》;
  2. 在线生成的链接:
    在这里插入图片描述

本文代码案例以第二种“在线生成”后的公私钥字符串作为变量进行操作。

//注意每隔64位必须要有一个换行//公钥-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCC2Kh46ZE2/k6hBfRHXOm37lQhQ9g7phdw2jGo0KNgW+wxW2pmZzQhLg+Dx9FyEXa3j0YraktnCIBkx816DLw/xUIhRObjYX4+5hUnv6IGtHf5pNyP9v/utiRdkko+Vj1BDWtI4lw/0DXruLJIV06EIf95TFfZaEk81/EO31FdpQIDAQAB-----END PUBLIC KEY-----//私钥-----BEGIN RSA PRIVATE KEY-----MIICWwIBAAKBgQCC2Kh46ZE2/k6hBfRHXOm37lQhQ9g7phdw2jGo0KNgW+wxW2pmZzQhLg+Dx9FyEXa3j0YraktnCIBkx816DLw/xUIhRObjYX4+5hUnv6IGtHf5pNyP9v/utiRdkko+Vj1BDWtI4lw/0DXruLJIV06EIf95TFfZaEk81/EO31FdpQIDAQABAoGATyoMTBNsY2xbYDr8/4wsb7cHOZUVp4km14V71BpfLnaPIZGgf1JjjMuUYXOsuantPMO3fZ7y/eR74f2syPIZllFqSI0CP1HkDyTH5BsLqKqTmzWcbvrWx1Pc2DisOCf9KVz4o/Scly3igI8Nblrk5zP03NMBb7dqyNzqsP2i6gUCQQDGojaHEWZ4qTZmwFhTccKX/DHc1vJesjS3JQHRU6TDWSML476KGoH3+S23XRfRsIFzN1QWrhqfopfgphP2gcPnAkEAqKKnmAOY0BhzMh0D7q94dtGZbg/MxQPpBRWvEcLsragv8NilM5Mp6gUjLcWSgEoBq4VcywQE/AOosXbOaQcgkwJAdedRgIkGjza50PH5O8a54CdVnaWFBkq3WcLAunTwxvfBAsyzjBxB62RgC4hZnCEuJarA4hmEOh90EWfjT54lHwJALSni2MOd2Z2yvGko9HPqP2hDP0bcAKfbcJEuIgOif5/btxVOqVFwmExn74pKgjFP4TAGehjJfPU96Ml43ogaIQJAYpbORQgUvJilLJGTIisWNF8Wa+lEt1J4tn7p47IDMOAaCwcbmDGnhnh67CXrwwJvb4F8tK/NiwNqlLhyDrONyg==-----END RSA PRIVATE KEY-----

三、代码

  1. 演示案例目录如图:

    在这里插入图片描述

  2. 客户端:index.html

参考学习

《》
《》
《》
《》
《》

  1. 服务端:check.php

参考学习

《》
《》

  1. 结果
    在这里插入图片描述

demo版本点击此处:《》


四、注意

  • 实际开发时可以把公私钥分别作为变量存入服务端脚本,把公钥传给客户端页面上的js,这样便于未来随时更改密钥;
  • 由于js字符串变量不能在一对引号里换行,所以需要利用 \n+
//例如var pubKey = "-----BEGIN PUBLIC KEY-----\n" +             "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCC2Kh46ZE2/k6hBfRHXOm37lQh\n";
  • 也可以把公钥变量存入一个表单控件,这样 js 获得的 value 就不用手动增加 \n 来改写公钥了;
//例如
  • 总之其主要目的就是不能缺少换行,方法多来西;
  • 有文章说可能在传递时会将 + 变成 空格,所以要完成一次过滤。当然,直到目前我还没发现有这个问题;
str_replace(' ','+', $p)
  • 还有一些注意点或问题请点击浏览:
    《》
    《》
    《》
    《》
    《》

转载地址:http://qxkpi.baihongyu.com/

你可能感兴趣的文章
数据结构之队列、栈
查看>>
数据结构之树
查看>>
数据结构之二叉树
查看>>
二叉树非递归遍历算法思悟
查看>>
红黑树算法思悟
查看>>
从山寨Spring中学习Spring IOC原理-自动装配注解
查看>>
实例区别BeanFactory和FactoryBean
查看>>
Spring后置处理器BeanPostProcessor的应用
查看>>
Spring框架的ImportSelector到底可以干嘛
查看>>
Mysql中下划线问题
查看>>
微信小程序中使用npm过程中提示:npm WARN saveError ENOENT: no such file or directory
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
Vue项目中使用img图片和background背景图的使用方法
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>