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无限分类源码分享(思路不错)
Oct 13 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
PHP实现微信公众平台音乐点播
Mar 20 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
php通过会话控制实现身份验证实例
Oct 18 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 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
第六节--访问属性和方法
2006/11/16 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
JS回调函数深入理解
2019/10/16 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
js验证账户名是否重复
2020/05/26 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
彻底理解Python list切片原理
2017/10/27 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
Python实现分段线性插值
2018/12/17 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
物流专业大学应届生求职信
2013/11/03 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
个人安全生产承诺书
2014/05/22 职场文书
销售人才自我评价范文
2014/09/27 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript