# simple_electronic_official_document_system_by_python **Repository Path**: xu-luming/simple_electronic_official_document_system_by_python ## Basic Information - **Project Name**: simple_electronic_official_document_system_by_python - **Description**: 使用python-flask框架实现的B/S模式的电子公文系统建模(实验四)。 具备基本的公文起草、审核、签收功能,实现了部分的用户管理、日志管理、权限管理功能。 项目使用国密实现公文本地加密存储与基于SM2和临时SM4密钥的公文签收。 部分功能仍不完善,有机会再修改吧。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-12-08 - **Last Updated**: 2024-12-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python, 电子公文系统, 实验四, Flask ## README # 简易电子公文系统实现 ## 要求 [实验要求文档链接](https://github.com/youer0219/Information-Security-System-Design-Assignment/blob/main/%E5%AE%9E%E9%AA%8C/%E8%B5%84%E6%96%99/%E5%AE%9E%E9%AA%8C%E8%A6%81%E6%B1%82(stu).md) ## TODO - 功能完善 - 审批:添加审批意见 - 权限:实现添加/删除权限/角色功能 - 登录:添加次数限制、~~应用HMAC~~ - 用户修改自己信息:应用邮箱验证 - ~~数据库(重点)~~:~~限制访问IP~~、~~使用配置文件~~、~~限制登录用户权限~~、~~数据备份管理~~ - 本地公文存储中加入对原始值的SM3哈希校验 - MYSQL只可访问本地备份数据文件 - 实现单独的init功能模块 - 整理css样式架构,优化并统一前端显示 - 文档完善 - 实验报告、~~各种图表~~、类的说明 - 更多修改 - 参考量化评估标准进行。尽管我也不知道他是咋搞的,但可以参考[AI的标准](https://www.doubao.com/thread/wd53b4b1eb22703ab)。 ## 学习参考 学习过程中至少参考了以下项目。在此对所有教学者与开源者表示感谢。 - [python flask连接mysql数据库实现登录注册](https://www.bilibili.com/video/BV1P5x7emE9H/?spm_id_from=333.337.search-card.all.click&vd_source=912de37828db7e4feff5c9492864d51c) - [90分钟用Python和Flask开发博客系统](https://www.bilibili.com/video/BV1gh411q7xo/?spm_id_from=333.337.search-card.all.click&vd_source=912de37828db7e4feff5c9492864d51c) - [基于Flask+MySQL的增删改查demo](https://github.com/mudfish/python-flask-user-crud) - [flask-principal-demo](https://github.com/likit/flask-principal-demo) 以及伟大的AI们,包括豆包、通义千问、kimi、GPT…… ## 功能实现 - 网页安全 - Flask-WTForms插件自带的令牌机制(只有部分页面用到了) - Flask-Talisman插件强制HTTPS访问以及默认的安全措施 - 证书和私钥使用openssl命令生成即可 - 作者只会使用插件。[具体作用参考AI](https://lxblog.com/qianwen/share?shareId=62d51567-39f4-4d10-9829-7180d5b00f13) - 如果发现链接被重置,可能是因为你是通过http访问,请修改网址重新访问 - Flak-Login登录时中防止next攻击:目前项目不需要这个功能,故没做。 - 你可以参考[这个对话](https://www.doubao.com/thread/w2014ab45a23e0ad6)来看看自己是否需要注意这个问题。 - 数据库安全 - 通过配置文件管理数据库连接参数,隐藏敏感信息(需要添加对配置文件的访问控制) - 访问IP限制:只允许本地访问 - 所有用到的用户都限制为仅可本地访问 - 数据库本身的配置可以参考[这个对话](https://lxblog.com/qianwen/share?shareId=a89bb686-fcde-432f-954b-0bf615659399) - 数据库用户创建与权限限制:无ROOT用户且权限最小 - 数据库备份:目前可以备份到项目backup文件夹。仅一份。只支持离线恢复。 - 公文一般操作 - 公文起草 - 公文查看 - 公文保存为草稿 - 公文编辑(草稿与审核失败的公文) - 公文审核 - 审核公文 - 公文签收 - 签收发给本单位的公文 - 本地归档没有实现 - 主要是因为公文发送到公共数据库时没有保留作者ID。如需更改可以在这方面入手。 - 同时也没有模拟不同单位不同本地数据库的情况 - 没有实现发文单位对签收失败的公文的处理 - 用户管理 - 用户登录 - 用户名+密码+邮箱 - 存储为随机盐值+混合盐值的哈希值 - 使用HMAC。密钥来自硬件中的SM4密钥值经过SM3密钥扩展后的48字节的新密钥。 - 当然不一定都是要依赖这个SM4密钥,可以在硬件中再存一个专门的hmac密钥,这里就不搞复杂了 - HMAC密钥位数多于哈希值的位数,以应对穷举密钥攻击 - 实现了邮箱发送验证码的功能。但没有应用 - 未作次数限制 - 用户列表 - 删除用户 - 目前只限制不能删除自己。同时通过数据库外键限制不能删除有任何角色的用户。 - 增加用户 - 默认无任何角色与权限。密码为123456。单位与操作者一致 - 日志管理 - 查看日志文件 - 只能简单查看日志文件。没有筛选统计,日志自动分割也没有测试。 - 权限管理 - 目前只实现了查看用户权限列表。 - 没有实现增加/删除用户角色等操作 ## 如何使用 - 安装所有需要的python库 - 需要的第三方库见requirement.txt - 使用pipreqs生成。[参考文章](https://blog.csdn.net/qq_42951560/article/details/118016862) - 使用requirement.txt安装:`pip install -r requirement.txt` - 数据库使用 - 使用MYSQL数据库 - 将db-init.sql文件中的sql语句拷贝到数据库中执行 - ~~目前数据库连接参数写在代码中,请确保你的用户为root,密码是123456或修改代码~~ - 现在不需要root用户,sql语句会自动创建所需用户 - 如果需要连接龙脉KEY的硬件 - 请插入龙脉KEY并取消main.py的main中的注释 - 代码会自动帮你在硬件中创建SM4密钥文件。成功执行后可以注释掉。 - 请确保你的KEY是默认设置。一个判断标准:官方demo运行正常。 - 请将gm_work_key_manager.py中的注释取消。 - 硬件应用后页面会明显卡顿。这是正常的。 - 实际公文系统也不可能用这个KEY来做公文系统的硬件设备。一般只用于验证身份。 ## 数据设置 - 测试用户数据 - 密码都是1。单位默认为“单位A” | 用户名 | 邮箱 | 角色 | 权限 | |-----|-------------------|---------|-----------| | 1 | user1@example.com | 系统管理员 | 用户管理 | | 2 | user2@example.com | 安全保密管理员 | 权限管理 | | 3 | user3@example.com | 安全审计员 | 日志管理 | | 4 | user4@example.com | 审核员 | 公文审核、公文签收 | | 5 | user5@example.com | 操作员 | 公文一般操作 | | 6 | user6@example.com | 以上所有 | 以上所有 | - 角色名(Role Names): 1. 系统管理员 - `sysAdmin` 2. 安全保密管理员 - `secAdmin` 3. 安全审计员 - `secAuditor` 4. 审核员 - `auditor` 5. 操作员 - `operator` - 权限(Permissions): 1. 用户管理 - `userMgmt` 2. 权限管理 - `permMgmt` 3. 日志管理 - `logMgmt` 4. 公文审核 - `docReview` 5. 公文签收 - `docSign` 6. 公文一般操作 - `docOps` - 包括公文的起草、查看、编辑等 ## 项目结构 - 密码应用结构: ![密码应用体系图](密码应用体系图.png) - 模块依赖关系图: ![模块依赖图.png](%E6%A8%A1%E5%9D%97%E4%BE%9D%E8%B5%96%E5%9B%BE.png) - main(3层,缺少db_backup) ![main_03.svg](main_03.svg) - db_decorator(6层,缺少db_backup) ![db_decorator.svg](db_decorator.svg) - 更多依赖图 - 额外安装pydeps库并安装[graphviz](https://graphviz.org/download/) - pydeps安装:`pip3 install pydeps` - graphviz安装:直接下载安装程序并执行。注意安装过程中有配置环境变量的选项,可以选一下。 - 终端使用命令生成依赖图,例如:`pydeps --max-bacon 6 --cluster -x os -x flask* -xx wtforms -xx pandas -xx loguru -o db_decorator.svg ./电子系统实现/db_decorator_apply.py` ## 更多信息 可以参考我的[实践过程文档以及实验报告](https://github.com/youer0219/Information-Security-System-Design-Assignment/tree/main/%E5%AE%9E%E9%AA%8C/%E5%AE%9E%E9%AA%8C%E5%9B%9B) 不过是当时开发时写的,作业交的急,没有整理…… ## 结语与后话 无论怎么讲,这个学期学到的AI的使用都将让我受益很久。之后的AI肯定更加强大,就看大家如何使用了。