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数据库抽象层 PDO
May 07 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
php解决约瑟夫环示例
Apr 09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 PHP
php清除和销毁session的方法分析
Mar 19 PHP
php实现求相对时间函数
Jun 15 PHP
基于PHP实现的多元线性回归模拟曲线算法
Jan 30 PHP
Laravel中获取IP的真实地理位置
Apr 01 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
PHP学习笔记之一
2011/01/17 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
php对数组排序代码分享
2014/02/24 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
TBCompressor js代码压缩
2011/01/05 Javascript
JS中操作JSON总结
2020/12/06 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
理解javascript闭包
2015/12/15 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Django csrf 验证问题的实现
2018/10/09 Python
Python实现Dijkstra算法
2018/10/17 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
python实现二维数组的对角线遍历
2019/03/02 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
详解Python实现进度条的4种方式
2020/01/15 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
资料员的岗位职责
2013/11/20 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
工作自我评价范文
2015/03/05 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python