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 相关文章推荐
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
用PHP+MySql编写聊天室
Oct 09 PHP
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php中的观察者模式简单实例
Jan 20 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
基于php实现的验证码小程序
Dec 13 PHP
laravel框架中间件简单使用方法示例
Jan 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
php 表单数据的获取代码
2009/03/10 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
jquery随机展示头像代码
2011/12/21 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
shiro授权的实现原理
2017/09/21 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
layui获取选中行数据的实例讲解
2018/08/19 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
20年同学聚会邀请函
2014/02/04 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
获奖感言一句话
2015/07/31 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
7个关于Python的经典基础案例
2021/11/07 Python
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL