RSA实现JS前端加密与PHP后端解密功能示例


Posted in PHP onAugust 05, 2019

本文实例讲述了RSA实现JS前端加密与PHP后端解密功能。分享给大家供大家参考,具体如下:

web前端,用户注册与登录,不能直接以明文形式提交用户密码,容易被截获,这时就引入RSA。

前端加密

需引入4个JS扩展文件,jsbn.js、prng4.js、rng.js和rsa.js。

<html>
<head>
  <title>RSA Login Test</title>
  <meta charset="utf-8">
  <script type="text/javascript" src="./js/jsbn.js"></script>
  <script type="text/javascript" src="./js/prng4.js"></script>
  <script type="text/javascript" src="./js/rng.js"></script>
  <script type="text/javascript" src="./js/rsa.js"></script>
  <script src="//cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  <script type="text/javascript">
    function cmdEncrypt() {
      var passwd = $('#passwd').val();
      var rsa = new RSAKey();
//openssl生成的modulus,十六进制数据
      var modulus = "DB1EA572B55F5D9C8ADF092F5DCC3559CFEA8CE8BB54E3A71DA9B1AFBD7D17CF80ADB224FE4EA5379BC782F41C137748D8F1B5A36AD62A127EF5E87EFB25C209A66BCEE9925CE09631BF2271E81123E93438646625080FF04F4F2CF532B077E3E390486DF40E7586F0AE522C873F33170222F46BDB6084F55DE6B7031E55DBE7";
      //openssl生成秘钥时的e的值(0x10001)
var exponent = "10001";
      rsa.setPublic(modulus, exponent);
      var res = rsa.encrypt(passwd);
      $('#passwd').val(res);
    }
  </script>
</head>
<body>
<form action="./login.php" method="post" >
  <label for="username">用户名:</label><input type="text" name="username" id="username">
  <label for="passwd">密 码:</label><input type="password" name="password" id="passwd">
  <input type="submit" value="登录" onclick="cmdEncrypt();">
</form>
</body>
</html>

前端代码十分简单,只有短短的几行,下面分别解释具体的含义:

  • 1.new一个RSAKey对象,
  • 2.定义modulus(模数),我们可以根据私钥计算出该值(十六进制),具体指令: rsa -in rsa_private_key.pem -noout -modulus 
  • 3.定义exponent,此值在openssl生成秘钥时,输出,一般情况下e的取值是一个定值10001(十六进制)
  • 4.设置公钥
  • 5.加密数据

至此,我们就完成了前端的公钥加密。

后端解密

//私钥
$private_key = "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDICrXl+ELhqFE0xCGA3/xdN1VxwUc5kxAKb5f3F28HY40zdXbn
uwpdQNKnHwTNvHZupBRHlYpqX+1Plti81sRadtYKNwVoLRlwwP3mzIyRRvO0hf3c
VXn33r4A5y1YUh+txvfgikbmmnsjP4pP3CIZC0TeDMt1+h17cV6s6KDdOQIDAQAB
AoGAdu2/NQkDIkvCc7+DN65yyCyklOvW34jqSXoM++8nqFnsUcKtPZn60HRAiPEt
Fu/L7X2JPQHP9+wuF1pUYvjAZQb5E9n8G12nxduBS5Ux085INOWP69pXnsljhyip
mpRgPf7ZsgGlftVXlg+HrUfzxj26NqEKwn61mi+CjMSMt/ECQQDpg868PEiJED/g
pUMTT7gRgDAdmPJ0+ALn82zsfA84zDA8Po9EREfXRM2Mar/fuvXL/vc0FBRYGaA/
VAinKJ6tAkEA203JDovTnfG87zNl9z0/z3kUxCMRy+7M28+7btF1eaDzxJWVFWtX
cv4EjHjDN6ClhT6ATuamw0sNlta9n4cGPQJASBltXItUbhV5U5hTNIQ5thWZRZoy
ylDFPO7ZI89ON+A7yG4ceByI/ft9Z6ySH7cvK1RG6WqFuYn4A3Wj0lDlZQJBAIjr
Pq0TRbLl25ToXTAIkI9jREDUuGa/mC1gu+ALbDHc+HTzAxpVY0rLJ2Hgf9l6Nf1D
sW4ReWqSsFBNkCRKc+0CQClxcPv2wwSGMFhLTqpKeySPIeVy4NrTHv8zEYvm7MuU
Gvlsj6sqvcuUQbVHoLRpqQiDi8TPaEMHzS9fhDjVUUc=
-----END RSA PRIVATE KEY-----";
$hex_encrypt_data = trim($_POST['password']); //十六进制数据
$encrypt_data = pack("H*", $hex_encrypt_data); //对十六进制数据进行转换
openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key); //解密数据
echo '解密后的数据:' . $decrypt_data;

openssl操作截图:

RSA实现JS前端加密与PHP后端解密功能示例

需要注意的是:前端加密的时候如果是中文,则解密后是乱码。

openssl工具和完整demo,详见:https://github.com/cqingt/RSA_JS_PHP

PHP 相关文章推荐
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
PHP校验ISBN码的函数代码
Jan 17 PHP
smarty 缓存控制前的页面静态化原理
Mar 15 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
Aug 01 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
Jan 14 PHP
php处理restful请求的路由类分享
Feb 27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
详解PHP中的状态模式编程
Aug 11 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 PHP
thinkPHP5框架接口写法简单示例
Aug 05 #PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 #PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 #PHP
php时间戳转换代码详解
Aug 04 #PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 #PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 #PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
Aug 03 #PHP
You might like
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
让焦点自动跳转
2006/07/01 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Python装饰器用法实例总结
2018/02/07 Python
Python中单例模式总结
2018/02/20 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
集团薪酬管理制度
2014/01/13 职场文书
初中英语教学反思
2014/01/25 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
学校周年庆活动方案
2014/08/22 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书