原文地址:https://blog.springcoder.cn/posts/5b7ae417.html

背景

在开发中,通常会偷懒将用户的登录信息(账号密码)直接以明文的方式发送到后端,但我们的项目不是所有都用了https,这在传输过程中存在一定的风险,于是,我们可以通过RSA非对称加密,将用户输入的账号密码进行加密后传输到后端,后端通过私钥解密后得到原始数据,进行后续的逻辑处理。

生成密钥

这里我们可以使用linux自带的openssl来生成密钥,首先生成私钥,通过如下命令生成:

openssl genrsa -out rsa_private_key.pem 1024

参数1024表示生成的密钥长度为1024比特,默认为2048,生成私钥后,我们通过私钥生成公钥:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

通过上述命令,即可生成公钥和私钥,对应两个文件,rsa_private_key.pemrsa_public_key.pem

PHP加密解密工具

上述生成了密钥,我们就可以直接用来进行加解密操作了,这里介绍php中实现rsa的加解密,密钥文件,我们可以直接使用,也可以将密钥字符复制到php文件中,这里不直接使用密钥文件。项目基于thinkphp5框架,我们在extra文件夹下新增一个文件rsa_key.php,内容如下:

<?php
/*** rsa加密公钥私钥*/
return array(// 私钥'private_key' => '原样复制私钥文件中的内容',// 公钥'public_key' => '原样复制公钥文件中的内容',
);

新增一个工具类,用于加密解密:

<?phpnamespace app\common\util;class RSAUtil
{public $privateKey;public $publicKey;/*** 构造方法* @access public*/public function __construct(){//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id//如果直接使用密钥文件,可通过函数file_get_contents()进行读取$this->privateKey = openssl_pkey_get_private(config('rsa_key.private_key'));//这个函数可用来判断公钥是否是可用的$this->publicKey = openssl_pkey_get_public(config('rsa_key.public_key'));}public function __call($method, $args){return json(['status' => '01', 'msg' => '方法不存在']);}public function privateEncrypt($data){$crypto = '';foreach (str_split($data, 117) as $chunk) {openssl_private_encrypt($chunk, $encryptData, $this->privateKey);$crypto .= $encryptData;}//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的$encrypted = $this->urlsafeB64encode($crypto);return $encrypted;}//加密码时把特殊符号替换成URL可以带的内容function urlsafeB64encode($string){$data = base64_encode($string);$data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);return $data;}//解密码时把转换后的符号替换特殊符号function urlsafeB64decode($string){$data = str_replace(array('-', '_'), array('+', '/'), $string);$mod4 = strlen($data) % 4;if ($mod4) {$data .= substr('====', $mod4);}return base64_decode($data);}//私钥加密的内容通过公钥可用解密出来public function publicDecrypt($encrypted){$crypto = '';foreach (str_split($this->urlsafeB64decode($encrypted), 128) as $chunk) {openssl_public_decrypt($chunk, $decryptData, $this->publicKey);$crypto .= $decryptData;}return $crypto;}//公钥加密public function publicEncrypt($data){$crypto = '';foreach (str_split($data, 117) as $chunk) {openssl_public_encrypt($chunk, $encryptData, $this->publicKey);$crypto .= $encryptData;}$encrypted = $this->urlsafeB64encode($crypto);return $encrypted;}//私钥解密public function privateDecrypt($encrypted){$crypto = '';foreach (str_split($this->urlsafeB64decode($encrypted), 128) as $chunk) {openssl_private_decrypt($chunk, $decryptData, $this->privateKey);$crypto .= $decryptData;}return $crypto;}
}

到此,后端的加解密就实现了。

JS前端加密传输

在登录界面,用户输入账号密码信息,点击登录,当参数校验通过,我们就可以对参数进行加密后,提交表单,这里使用jsencrypt实现前端的加密。

function encrypt(data) {const publicKey = {$private_key|json_encode};let encryptor = new JSEncrypt();encryptor.setPublicKey(publicKey)return encryptor.encrypt(data)
}

这样,我们可以发现,提交的数据就是被加密过的密文了。

后端接收到参数后,对参数进行解密,即可得到原始数据。

// 登录信息解密
$rsaUtil = new RSAUtil();
$user_name = $rsaUtil->privateDecrypt('user_name');
$password = $rsaUtil->privateDecrypt('password');

使用RSA加密传输账号密码信息相关推荐

  1. 14-SpringSecurity:前后端分离项目中用户名与密码通过RSA加密传输

    背景 登录认证几乎是所有互联网应用的必备功能,传统的用户名-密码认证方式依然流行,如何避免用户名.密码这类敏感信息在认证过程中被嗅探.破解? 这里将传统的用户名.密码明文传输方式改为采用 RSA 的非 ...

  2. Js参数RSA加密传输之jsencrypt.js的使用

    这篇文章主要介绍了Js参数RSA加密传输之jsencrypt.js的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 注意几点: 1.参数传递的+号处理,在传输时会把+变成 ...

  3. 电信级的RSA加密后的密码的破解方法

    一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...

  4. RSA加密传输代码示例

    RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了. 服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现 ...

  5. D-Link DCS系列监控账号密码信息泄露

    简介: 漏洞编号:CVE-2020-25078 D-Link DCS是网络监控摄像机设备,通过访问特定的URL可以得到账号密码信息,攻击方可以 直接进入利用漏洞得到账户密码直接进入后台获取视频监控页面 ...

  6. D-Link DCS系列监控 账号密码信息泄露漏洞

    漏洞简介 D-Link DCS-2200是一款监控摄像机,成像色彩为彩色 是一款网络摄像机, 根据VULDB 所看到的信息原文如下 A vulnerability, which was classif ...

  7. iOS动态部署之RSA加密传输Patch补丁

    概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...

  8. Linux基础——系统安全及应用(su切换用户PAM认证,sudo提权,grub加密,账号密码破解,端口扫描)(十)

    系统安全及应用 一. 账号安全控制 1.系统账号清理 2.密码安全控制 3.命令历史.自动销毁 二. 用户切换与提权 2.1 su命令 2.1 sudo命令--提升权限 2.1.1 su命令的缺点 2 ...

  9. 工具推荐 | 利用开源工具查看MobaXterm远程终端工具存储的Session账号密码信息

    欢迎关注「WeiyiGeek」公众号 点击

最新文章

  1. JavaScript实现冒泡排序
  2. ThinkPHP U方法
  3. Robert算子的运用
  4. 第十一章 机器学习系统设计-机器学习老师板书-斯坦福吴恩达教授
  5. hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)
  6. Linux网络编程实例详解
  7. 安装.Net Standard 2.0, Impressive
  8. 如何查看windows xp系统的位数?
  9. gradle-学习笔记(2)-多项目构建
  10. Django 前后端数据传输、ajax、分页器
  11. 连接好友服务器失败 无法显示,不显示好友的网络状态
  12. 一种免费下载专利的方法
  13. ITIL 4讲解:ITIL4的设计框架解析
  14. 莫兰迪紫rgb_莫兰迪色系颜色大全 莫兰迪色系适合什么人
  15. QT实现点击按钮打开和关闭窗口
  16. 礼金记账本安卓_份子钱记账app
  17. 技术晨读_2014_9_1
  18. Day165/200 JS import * from 用法
  19. 如何在表格里做计算机统计表,excel怎么制作统计表格 excel统计表怎么添加标题...
  20. 教你给大量视频快速调整色调的方法

热门文章

  1. linux 内核 遍历文件夹,Linux内核中通过文件描述符获取绝对路径
  2. git clone出现 fatal: unable to access ‘https://github.com/...‘的两种解决方法
  3. Android系统版本适配
  4. js DOM parentElement parentNode - Kaiqisan
  5. 工业互联网安全标准体系(2021年)及对应标准建设方向正式发布
  6. QLExpress支持的操作符
  7. 支付宝预授权冻结转支付
  8. [Google Guava]--Ordering类
  9. java获取当前时间年月_Java获取时间年、月、日的方法
  10. AI有望编制纳税申报表,连会计也要面临下岗危机?