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版(2)
Oct 09 PHP
php 过滤危险html代码
Jun 29 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
PHP APC的安装与使用详解
Jun 13 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
php常用数组函数实例小结
Dec 29 PHP
php生成无限栏目树
Mar 16 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
PHP使用HTML5 FormData对象提交表单操作示例
Jul 02 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 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中extract()函数的妙用分析
2012/07/11 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
javascript时区函数介绍
2012/09/14 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
挑战杯创业计划书的写作指南
2014/01/07 职场文书
大学生校园创业计划书
2014/02/08 职场文书
餐饮营销方案
2014/02/23 职场文书
寄语是什么意思
2014/04/10 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
服务理念口号
2014/06/11 职场文书
助残日活动总结
2014/08/27 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
财务总监岗位职责
2015/02/03 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
Python os和os.path模块详情
2022/04/02 Python