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面向对象 字段的声明与使用
Jun 14 PHP
PHP 观察者模式的实现代码
May 10 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
joomla组件开发入门教程
May 04 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
详解PHP中mb_strpos的使用
Feb 04 PHP
掌握PHP垃圾回收机制详解
Mar 13 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制作文本式留言板
2015/03/18 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
详解Python IO编程
2020/07/24 Python
设置器与访问器的定义以及各自特点
2016/01/08 面试题
房屋租赁协议书范本
2014/04/10 职场文书
欢迎词怎么写
2015/01/23 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
就业意向书范本
2015/05/11 职场文书
初中政教处工作总结
2015/08/12 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs