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。

相关推荐
蒸蒸yyyyzwd2 小时前
cpp选手秋招学习笔记day24-cs144项目总结
运维·服务器·网络
瓦格哈儿2 小时前
删掉旧 SSL 证书会影响线上业务吗?风险点梳理
网络协议·https·ssl
数据知道2 小时前
静态分析入门——PE 结构、字符串、导入表快速定性
网络·安全·web安全·网络安全
CCYe、2 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
葡萄城技术团队2 小时前
从设备协议数据到完整OEE:机加工车间设备效率分析的技术实现路径
网络
美酒没故事°3 小时前
https和tls有什么区别?
网络协议·http·https
码农小麦3 小时前
LangChain 1.3.18 + DeepSeek-v4-flash 工具调用踩坑实录
网络·数据库·langchain
吴声子夜歌3 小时前
Guava——事件总线
java·网络·guava
比兔代理4 小时前
住宅代理IP的出口节点调度:ASN、BGP 与 IP 段信誉机制解析
linux·服务器·网络
AAA代码批发商4 小时前
DAYS 38 TCP并发服务器模型详解
linux·网络·笔记·学习