当前位置: 首页 > news >正文

HTTP的系统登录页面,如何避免明文传输用户密码?

对于系统登录页面来说,我们作为开发人员,应该没有陌生的吧。就像下面这样子。

点击登录,调用/login 接口。来看下面截图中的 载荷(payload)数据,其中,密码 password 的值是明文。 

如果你的站点使用的是HTTPS协议,配置了有效的SSL证书,那将很好。HTTPS通过SSL/TLS协议建立安全的加密通信通道,确保传输过程中的数据被加密。这样,用户在登录页面输入的密码将在传输过程中得到保护。

如果你的站点使用的是普通的HTTP协议,安全层面,就要考虑了。因为,HTTP会使用明文的形式将这个用户密码提交到服务端接口。

因此,前后端需要改造一下,使用密文来传输用户密码。

AI告诉我们:如果需要在客户端对密码进行加密,可以使用JavaScript等技术对密码进行加密处理,然后再将加密后的密码传输给服务器。这样即使在传输过程中,密码也是以加密形式传输的。但是要注意,客户端加密需要谨慎设计和实施,确保密码的加密过程安全可靠。

就像下面这样子。

如何实现?

我们的系统是基于ruoyi框架搭建的。

前端jquery引入CryptoJS库,利用DES加密算法对密码进行加密。

问题来了,加密key怎么办?

一种方案,是前端调用服务端接口获取动态加密key。这是常规的办法。

现在,我们使用另一种方案,不需要调用后端接口获取key的办法。

前端如何生成动态key,而且还能让后端接口能解密?

答案是:基于时间。再细节一些,基于当前时间戳。

你一定会存疑:用户浏览器和服务器时间不一定总是一致呀!

是的。因此,先省略一些文字,直接贴代码给你看吧。

 1 function login() {2     var username = $.common.trim($("input[name='username']").val());3     var password = $.common.trim($("input[name='password']").val());4     var validateCode = $("input[name='validateCode']").val();5     var rememberMe = $("input[name='rememberme']").is(':checked');6     var key = Math.floor(jQuery.now() / 30000).toString();7     $.ajax({8         type: "post",9         url: ctx + "login",
10         data: {
11             "username": username,
12             "password": encryptByDES(password, key),
13             "validateCode" : validateCode,
14             "rememberMe": rememberMe
15         },
16         success: function(r) {
17             if (r.code == 0) {
18                 location.href = ctx + 'index';
19             } else {
20                 ...
21             }
22         }
23     });
24 }
25 
26 function encryptByDES(message,key) {
27     var keyHex = CryptoJS.enc.Utf8.parse(key);
28     console.log("keyHex:"+keyHex)
29     var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
30         mode: CryptoJS.mode.ECB,
31         padding: CryptoJS.pad.Pkcs7
32     });
33     return encrypted.toString();
34 }
View Code

重点是第6行。明白后,我们再看后端程序对密文的处理。

    // *password 是前端传过来的密文long floor = (long) Math.floor(System.currentTimeMillis() / 30000);String passwordText = null; // *明文try {passwordText = DESUtils.decrypt(password, String.valueOf(floor));} catch (Exception e) {log.error("密码解密异常1:", e);try {passwordText = DESUtils.decrypt(password, String.valueOf(floor-1));} catch (Exception ex) {log.error("密码解密异常2:", e);return error("非法请求");}}
View Code

完事!

接着说用户登录密码的安全。

上面用的是DES这种简单的加密算法。其实,如果想更安全,可以使用非对称加密算法,如RSA。

相关文章:

  • 【算法】贪心算法——柠檬水找零
  • 个人关于ChatGPT的用法及建议
  • 颠覆传统:探索Web3对传统计算机模式的冲击
  • Linux-struct list_head的快速使用
  • TPL0401B使用教程
  • springboot+vue的养老院管理系统
  • 【机器学习】让大模型变得更聪明
  • C#根据数据量自动排版标签的样例
  • 【CPP】栈简介及简化模拟实现
  • C语言学习笔记之结构体(一)
  • Android 车载 Audio 中 有关系统按键无声的问题排查小结
  • qi5uxeel算法分析流程记录libmsec.so
  • 14.微信小程序之地理定位功能
  • OSG学习记录
  • uniapp条件编译
  • Google 是如何开发 Web 框架的
  • Django 博客开发教程 8 - 博客文章详情页
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript设计模式与开发实践系列之策略模式
  • Java程序员幽默爆笑锦集
  • Just for fun——迅速写完快速排序
  • Linux CTF 逆向入门
  • mongo索引构建
  • 简单易用的leetcode开发测试工具(npm)
  • 免费小说阅读小程序
  • 深度解析利用ES6进行Promise封装总结
  • 时间复杂度与空间复杂度分析
  • 我这样减少了26.5M Java内存!
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用jquery写贪吃蛇
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 【干货分享】dos命令大全
  • #{}和${}的区别是什么 -- java面试
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm电影分享网站
  • (简单) HDU 2612 Find a way,BFS。
  • (离散数学)逻辑连接词
  • (理论篇)httpmoudle和httphandler一览
  • (十六)Flask之蓝图
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)OpenStack Hacker养成指南
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • /etc/sudoers (root权限管理)
  • [20160807][系统设计的三次迭代]
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BIZ] - 1.金融交易系统特点
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [c++] 自写 MyString 类
  • [ccc3.0][数字钥匙] UWB配置和使用(二)