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 相关文章推荐
删除及到期域名的查看(抢域名必备哦)
May 14 PHP
PHP 采集心得技巧
May 15 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
PHP转换文件夹下所有文件编码的实现代码
Jun 06 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
Aug 20 PHP
PHP之预定义接口详解
Jul 29 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
PHP获取ttf格式文件字体名的方法示例
Mar 06 PHP
PHP+redis实现微博的推模型案例分析
Jul 10 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php除数取整示例
2014/04/24 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
JavaScript EasyPager 分页函数
2011/05/25 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
angular分页指令操作
2017/01/09 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
vue cli 全面解析
2018/02/28 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
python实现图片识别汽车功能
2018/11/30 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
应届生人事助理求职信
2013/11/09 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
婚前协议书范本
2014/10/27 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
交通安全学习心得体会
2016/01/18 职场文书
Node.js实现断点续传
2021/06/23 Javascript
python创建字典及相关管理操作
2022/04/13 Python