国密传输加密与签名演示DEMO

具体实现细节链接地址:

  1. 项目简介
  2. 密钥交换和用户认证
  3. 敏感数据加密传输
  4. 传输签名校验
  5. 数据库用户密码加密
  6. 配置文件加密

项目仓库链接地址

项目演示链接地址

  • LOGIN-DEMO
  • 默认用户名密码:adminadmin123

1.项目简介

1.1.密钥交换和用户认证

  1. 前端请求后端获取SM2公钥
  2. 前端随机生成SM4密钥(key+iv)
  3. 用户认证(用户输入用户名和密码
  4. 前端分别使用SM2公钥加密(用户密码、key、iv)
  5. 后端使用SM2私钥解密获得(用户密码、key、iv)
  6. 用户认证成功将key、iv存入loginUser然后存入redis
  7. 生成JWT,请勿将key、iv存入JWT (JWT只能保证数据完整性)
  8. 返回前端存入sessionStorage (完成用户认证和密钥交互)
  9. 使用sm4密钥加密业务数据进行传输

Snipaste_2024-08-28_10-26-02

1.2.敏感数据加密传输

  1. 前端从sessionStorage中获取sm4密钥iv
  2. 加密敏感数据发送至后端
  3. 后端使用从JWT中获取到redisKey获取该登陆会话的loginUser,并从loginUser中获取到登陆时存入的sm4密钥和iv
  4. 使用该sm4密钥解密前端传来的加密数据
  5. 使用该密钥加密需要响应的敏感数据
  6. 前端获取到响应中sm4加密后的密文,使用sessionStorage中的密钥和iv进行解密

20240828122836

1.3.传输签名校验

前端密钥交换成功的前提是需要保证传输过程中数据不被篡改,因此需要使用到签名校验

  1. 通过axios请求拦截器,拦截到需要签名的请求
  2. 判断get还是post请求,以及请求体类型
  3. 拼接参数SM3(SALT$+URI+拼接的请求参数+$Timpstamp)
  4. SignTimestamp放入请求头
  5. 签名过滤器判断是否存在签名时间戳
  6. 拼接前端传来的请求参数
  7. 签名生成enSign与前端Sign做对比,相同签名校验通过,不同签名校验失败

image-20231229192445103

1.4.数据库用户密码加密

数据库用户密码也需要使用国密算法进行加密存储,数据库加密通常使用单向hash加密算法

  1. 添加自定义密码加密盐

  2. 对用户密码进行三次加盐的sm3加密

1.5.配置文件加密

  1. 使用jasypt对application配置密钥及密码数据进行加密
  2. 实现PBEStringEncryptor接口使用自定义SM4加密算法进行加密
  3. 将配置文件解密密钥存入环境变量

2.项目关于

2.1.项目启动

  • 安装依赖 npm install
  • 项目启动 npm run serve
  • 启动redis,(默认为空密码,请在生产环境中设置密码)
  • 启动mysql,(默认为若口令密码123456,请在生产环境中设置强密码)
  • 启动后端服务
  • 默认登陆用户名密码 admin,admin123

2.2.需要一些简单的基础知识

2.3.生产环境中的一些注意事项和提示

  • 请勿在代码中硬编码密钥和密码
  • 请勿在配置文件中明文存储密钥和密码
  • 该项目均使用国密算法实现
  • 该项目编码者本身并非专业开发,项目可能存在诸多BUG,欢迎提issue,或者联系本人。

注:本项目为个人项目,仅提供演示作用,且不为任何企业或组织的编码规范