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扩展函数
Oct 09 PHP
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
用PHP的ob_start();控制您的浏览器cache!
Feb 14 PHP
PHP Token(令牌)设计
Mar 15 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
php实现的用户查询类实例
Jun 18 PHP
php通过文件头判断格式的方法
May 28 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 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选项与信息函数的使用详解
2013/05/10 PHP
PHP积分兑换接口实例
2015/02/09 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
Python实用日期时间处理方法汇总
2015/05/09 Python
Python3使用requests发闪存的方法
2016/05/11 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
营业员个人总结的自我评价
2013/10/25 职场文书
大三在校生电子商务求职信
2013/10/29 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
司机岗位职责
2015/02/04 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers