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 相关文章推荐
在IIS上安装PHP4.0正式版
Oct 09 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
php 定界符格式引起的错误
May 24 PHP
PHP防CC攻击实现代码
Dec 29 PHP
详解php的魔术方法__get()和__set()使用介绍
Sep 19 PHP
如何用php获取程序执行的时间
Jun 09 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
Jun 08 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
php实现保存周期为1天的购物车类
Jul 07 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中养成7个面向对象的好习惯
2010/07/17 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php 文件上传实例代码
2012/04/19 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
Python Web服务器Tornado使用小结
2014/05/06 Python
深入理解Python中的super()方法
2017/11/20 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python创建学生管理系统
2019/11/22 Python
诉讼财产保全担保书
2014/05/20 职场文书
小学班主任培训方案
2014/06/04 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
群众路线表态发言材料
2014/10/17 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
网络研修心得体会
2016/01/08 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
关于Python中进度条的六个实用技巧分享
2022/04/05 Python