背景
登录认证几乎是所有互联网应用的必备功能,传统的用户名-密码认证方式依然流行,如何避免用户名、密码这类敏感信息在认证过程中被嗅探、破解?
这里将传统的用户名、密码明文传输方式改为采用 RSA
的非对称加密算法密文传输,即使认证请求被网络抓包,只要私钥安全,则认证流程中的用户信息相对安全;
- 一般是生成
RSA
的密钥对之后,公钥存储在前端或后端(登录时每次请求后端返回公钥)进行加密,私钥存储在后端用于解密; - 曾在实际的应用中看到过动态生成密钥对的做法,即公钥-私钥都是动态生成,每次请求都不一样,这与固定公钥-私钥的做法相比,性能上损耗较大,而在安全性上的收益并没有增加多少;因此这里采用固定密钥对的方式进行演示。
生成RSA密钥对
主要涉及三条命令:
1 | bash复制代码# 生成RSA私钥 |
- Windows操作系统: Win10
下载安装 OpenSSL
:slproweb.com/products/Wi…
打开 openssl.exe
所在目录,我这里是: D:\Program Files\OpenSSL-Win64\bin
,运行exe,执行上述三行命令实现 RSA
密钥对生成:
1 | bash复制代码OpenSSL> genrsa -out rsa_private_key.pem 1024 |
- Linux操作系统:CentOS7
同样,执行上述三行命令实现 RSA
密钥对生成:Note:
- 后续编码实现时,使用Windows上生成的秘钥进行演示;
- 公钥、私钥用的是下图中红色椭圆标注出来的内容。
1 | bash复制代码公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/yhacWdmSauP3/NaDNi1/2l9ZZTy+kpRW5OaQcNRErkA1a3APE+IK3axaBGOk9pjUADIrs0Sn2JEtZUMdQvi9B67qjj4RcAy+68aw0FPvIP7awr/g0KDAGyHLXqoMS0K7zGbNTriaytF6RqeAmu1sX7pPB1Mp40PX4VyI1s1k4wIDAQAB |
后端服务
基于 SpringBoot
, SpringSecurity
实现用户认证功能。
项目依赖
1 | xml复制代码<dependency> |
SpringSecurity配置
注意放行认证接口,否则报错:403。
1 | java复制代码@Configuration |
用户信息配置
为了集中焦点在本篇的用户名-密码加密传输上,避免引入其他复杂性,这里采用内存型用户信息来演示,关于从数据库中获取用户信息,可参考6-SpringSecurity:数据库存储用户信息。
1 | java复制代码@Component |
认证接口
这里将私钥配置在 applicaiton.yml
中。
1 | java复制代码@RestController |
自定义工具类进行解密
1 | xml复制代码<dependency> |
1 | java复制代码public class RSAEncrypt { |
使用hutool中的工具类进行解密
1 | xml复制代码<dependency> |
前端工程
基于 Vue3.0
, axios
实现极简登录页面。
Note:
- 前提需要有
Node.js
环境,可使用nvm
进行Node.js
的多版本管理;可参考heartsuit.blog.csdn.net/article/det… npm install <package>
默认会在依赖安装完成后将其写入package.json
,因此安装依赖的命令都未附加save
参数。
1 | bash复制代码$ node -v |
安装vue-cli并创建项目
1 | bash复制代码npm install -g @vue/cli |
刚开始的 package.json
依赖是这样:
1 | json复制代码 "dependencies": { |
集成Axios
- 安装依赖
1 | bash复制代码npm install axios |
此时, package.json
的依赖变为:
1 | json复制代码 "dependencies": { |
- 按需引入
在需要使用axios的组件中引入 import axios from "axios";
集成jsencrypt
此时, package.json
的依赖变为:
1 | json复制代码 "dependencies": { |
- 按需引入
在需要使用JSEncrypt的组件中引入 import JSEncrypt from "jsencrypt";
最终的前端登录组件代码
1 | vue复制代码<template> |
RSA加密传输效果
可能遇到的问题
- 开发环境跨域
方法一:通过开发环境(生产环境可通过Nginx实现)的代理服务进行请求转发,新建 vue.config.js
文件,内容如下:
1 | js复制代码module.exports = { |
方法二:因为后端服务是我们自己开发的,所以可以在后端进行CORS配置,允许跨域
1 | java复制代码@Configuration |
附:代码生成RSA密钥对
当然,除了使用Windows、Linux上的openssl工具生成密钥对之外,我们也可以使用代码来直接生成。
1 | xml复制代码<dependency> |
1 | java复制代码public class RSAEncrypt { |
Reference
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文转载自: 掘金