<div align="center">
<img src="https://cdn.jsdelivr.net/gh/Xuyan-cmd/picture-bed/246x0w.png" width="80px" height="80px">
<h1 align="center">
☁️中传放心传(CUC-cloud-disk-upload-management-system)
</h1>
<h3 align="center">
一个基于Vue和springboot+mybatisplus实现的文件云盘管理系统
</h3>
![Vue.js](https://img.shields.io/badge/-VueJS-333333?style=flat&logo=Vue.js)
![Node.js](https://img.shields.io/badge/-Node.js-333333?style=flat&logo=node.js)
![Java](https://img.shields.io/badge/-Java-333333?style=flat&logo=Java&logoColor=007396)
![MySQL](https://img.shields.io/badge/-MySQL-333333?style=flat&logo=mysql)
![SpringBoot](https://img.shields.io/badge/-SpringBoot-333333?style=flat&logo=SpringBoot)
<img src="https://s6.jpg.cm/2022/08/14/PllW0X.png" >
</div>
[![Typing SVG](https://readme-typing-svg.herokuapp.com?size=30&duration=1497¢er=%E9%94%99%E8%AF%AF%E7%9A%84&vCenter=%E9%94%99%E8%AF%AF%E7%9A%84&multiline=true&width=620&height=70&lines=%E4%B8%AD%E4%BC%A0%E6%94%BE%E5%BF%83%E4%BC%A0;CUC-cloud-disk-upload-management-system)](https://git.io/typing-svg)
### 📔任务清单
- 基于网页的用户注册与登录系统(60分)
- 使用https绑定证书到域名而非IP地址 【 *PKI* *X.509* 】
- 允许用户注册到系统
- 用户名的合法字符集范围:中文、英文字母、数字
- 类似:-、_、.等合法字符集范围之外的字符不允许使用
- 用户口令长度限制在36个字符之内
- 对用户输入的口令进行强度校验,禁止使用弱口令
- 使用合法用户名和口令登录系统
- 禁止使用明文存储用户口令 【PBKDF2、散列算法、慢速散列、针对散列算法(如MD5、SHA1等)的攻击方法】
- 存储的口令即使被公开,也无法还原/解码出原始明文口令
- (可选)安全的忘记口令 / 找回密码功能
- (可选)微信/微博/支付宝的OAuth授权登录 / 注册绑定
- (可选)双因素认证
- OTP: Google Authenticator
- Email
- SMS
- 扫码登录
- 基于网页的文件上传加密与数字签名系统(20分)
- 已完成《基于网页的用户注册与登录系统》所有要求
- 限制文件大小:小于 10MB
- 限制文件类型:office文档、常见图片类型
- 匿名用户禁止上传文件
- 对文件进行对称加密存储到文件系统,禁止明文存储文件 【 *对称加密* *密钥管理(如何安全存储对称加密密钥)* *对称加密密文的PADDING问题* 】
- 系统对加密后文件进行数字签名 【 *数字签名(多种签名工作模式差异)* 】
- (可选)文件秒传:服务器上已有的文件,客户端可以不必再重复上传了
- 基于网页的加密文件下载与解密(20分)
- 已完成《基于网页的文件上传加密与数字签名系统》所有要求
- 提供匿名用户加密后文件和关联的数字签名文件的下载
- 客户端对下载后的文件进行数字签名验证 【 *非对称(公钥)加密* *数字签名* 】
- 客户端对下载后的文件可以解密还原到原始文件 【 *对称解密* *密钥管理* 】
- 提供已登录用户解密后文件下载
- 下载URL设置有效期(限制时间或限制下载次数),过期后禁止访问 【 *数字签名* *消息认证码* *Hash Extension Length Attack* *Hash算法与HMAC算法的区别与联系* 】
- 提供静态文件的散列值下载,供下载文件完成后本地校验文件完整性 【 *散列算法* 】
**项目开发日志请查看:**[项目进度](https://www.xuyanblog.cn/%E5%AF%86%E7%A0%81%E5%AD%A6%E5%B0%8F%E5%AD%A6%E6%9C%9F%E5%AE%9E%E8%B7%B5)
**前端开发日志:**[前端工作日志](https://github.com/Xuyan-cmd/CUC-cloud-disk-upload-management-system/blob/front_end/README.md)
**后端开发日志:**[后端工作日志](https://github.com/Xuyan-cmd/CUC-cloud-disk-upload-management-system/blob/rear_end/README.md)
### 🚀快速上手使用
#### 👉👉👉[中传放心传使用文档](https://nextjs-docs-xuyan-cmd.vercel.app/)👈👈👈
### 💻功能概览
- 用户登录注册功能
- 包括对于用户口令的强度检验、口令长度、口令内容信息限制
- ![](https://s6.jpg.cm/2022/08/02/PQkdgf.png)
- 用户信息修改、头像上传、昵称修改、存储空间分配
- <img src="https://s6.jpg.cm/2022/08/02/PQklGU.png" style="zoom:50%;" />
- 文件上传、重命名、删除功能完整实现
- 对于支持文件类型包括:.txt .pdf .doc .mp3 .mp4 .zip .pdf .rar等,大小限制在了30MB
- ![](https://s6.jpg.cm/2022/08/02/PQkVvw.png)
- 支持文件的下载和分享
- 同时对于音频和视频文件的下载分享链接的设定有效时间为1小时
- ![](https://s6.jpg.cm/2022/08/02/PQkXei.png)
- 支持对于文件在平台端的移动、文件夹的创建和属性信息的查看
- ![](https://s6.jpg.cm/2022/08/02/PQkcsk.png)
- 支持多种文件排序方式,可以根据文件大小、创建时间进行排序
- ![](https://s6.jpg.cm/2022/08/02/PQkUhe.png)
- 能够对文件进行收藏标记、同时支持对于jpg、png、mp4格式文件收录于相册
- ![](https://s6.jpg.cm/2022/08/02/PQk1Jr.png)
- 已配置音乐播放器组件、视频播放组件,支持音乐、视频在线播放
- ![](https://s6.jpg.cm/2022/08/02/PQkSwR.png)
- ![](https://s6.jpg.cm/2022/08/02/PQkYiz.png)
- 实现了对于用户上传的文件数据进行加密,加密完成后,包括对于文件的下载、查看、删除都需要进行对应的口令校验
- ![](https://s6.jpg.cm/2022/08/02/PQkFh4.png)
- 计算文件散列值,并与数据库中的原始文件进行对比校验,验证文件身份标识和是否被篡改
- ![](https://s6.jpg.cm/2022/08/02/PQkmnX.png)
- 支持对于多个文件进行全局设定
- ![](https://s6.jpg.cm/2022/08/02/PQkpJD.png)
### 🔏密码学理论与技术要点分析
- 对用户口令进行加密存储
- Spring Security 支持多种不同的数据源,这些不同的数据源最终都将被封装成 UserDetailsService 的实例,我们是自己来创建一个类实现 UserDetailsService 接口,除了自己封装,我们也可以使用系统默认提供的 UserDetailsService 实例
- 我们来看下 UserDetailsService 都有哪些实现类:
- ![](https://mmbiz.qpic.cn/mmbiz_png/GvtDGKK4uYmb6x5Teic0aJ1mApcZ96eibLhVBfSV1FNGuGKZIYyTxyr6KhP0OKNGfWofickqy0hjkyko1rTGGX0wQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)
- 可以看到,在几个能直接使用的实现类中,除了 InMemoryUserDetailsManager 之外,还有一个 JdbcUserDetailsManager,使用 JdbcUserDetailsManager 可以让我们通过 JDBC 的方式将数据库和 Spring Security 连接起来。
- 这里需要数据库支持,所以我们在项目中添加如下两个依赖:
- ```typescript
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
```
- 然后再在 application.properties 中配置一下数据库连接,配置完成后,就可以启动项目。
- ![](https://s6.jpg.cm/2022/08/02/PQkvzp.png)
- 对用户口令的强度校验和规则设定
- Vue框架下,可以通过前端页面对于用户注册输入的口令进行强度限制和规则设定,其中输入口令强度检验在js代码的编写中设定好规则,本项目规定密码只能为阿拉伯数字、英文字母(不区分大小写)、除".-\"以外的特殊符号进行设定,当用户采用其中不同组合时,密码强度的设定也为随之提高,本项目用颜色进行区分。
- 而在特殊符号的筛选当中,使用正则表达式去进行筛选鉴别即可,确保用户的口令不会过于简单。
- 同时在input的输