11
This commit is contained in:
215
docs/QrCode_Encryption_Usage.md
Normal file
215
docs/QrCode_Encryption_Usage.md
Normal file
@@ -0,0 +1,215 @@
|
||||
# 加密二维码使用说明
|
||||
|
||||
## 概述
|
||||
|
||||
本系统提供了基于token的二维码加密和解密功能,可以安全地生成包含敏感信息的二维码,并设置过期时间。
|
||||
|
||||
## 主要特性
|
||||
|
||||
1. **AES加密**:使用AES对称加密算法保护二维码数据
|
||||
2. **Token机制**:每个二维码都有唯一的token作为密钥
|
||||
3. **过期控制**:可设置二维码的有效期(1-1440分钟)
|
||||
4. **Redis存储**:token和原始数据存储在Redis中,支持自动过期
|
||||
5. **数据验证**:解密时会验证数据完整性
|
||||
|
||||
## API接口
|
||||
|
||||
### 1. 生成普通二维码
|
||||
|
||||
```http
|
||||
GET /api/qr-code/create-qr-code?data=https://example.com&size=200x200
|
||||
```
|
||||
|
||||
**参数:**
|
||||
- `data`: 要编码的数据(必需)
|
||||
- `size`: 二维码尺寸,格式:宽x高 或 单个数字(可选,默认200x200)
|
||||
|
||||
**响应:** 直接返回PNG图片流
|
||||
|
||||
### 2. 生成加密二维码(返回JSON)
|
||||
|
||||
```http
|
||||
POST /api/qr-code/create-encrypted-qr-code
|
||||
```
|
||||
|
||||
**参数:**
|
||||
- `data`: 要加密的数据(必需)
|
||||
- `width`: 二维码宽度(可选,默认200)
|
||||
- `height`: 二维码高度(可选,默认200)
|
||||
- `expireMinutes`: 过期时间分钟数(可选,默认30,最大1440)
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "生成加密二维码成功",
|
||||
"data": {
|
||||
"qrCodeBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
|
||||
"token": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
|
||||
"originalData": "https://example.com/user/123",
|
||||
"expireMinutes": "30"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 生成加密二维码(返回图片流)
|
||||
|
||||
```http
|
||||
GET /api/qr-code/create-encrypted-qr-image?data=https://example.com&size=300x300&expireMinutes=60
|
||||
```
|
||||
|
||||
**参数:**
|
||||
- `data`: 要加密的数据(必需)
|
||||
- `size`: 二维码尺寸(可选,默认200x200)
|
||||
- `expireMinutes`: 过期时间分钟数(可选,默认30)
|
||||
|
||||
**响应:** 直接返回PNG图片流,并在响应头中包含token信息
|
||||
- `X-QR-Token`: 二维码的token
|
||||
- `X-QR-Expire-Minutes`: 过期时间
|
||||
|
||||
### 4. 解密二维码数据
|
||||
|
||||
```http
|
||||
POST /api/qr-code/decrypt-qr-data
|
||||
```
|
||||
|
||||
**参数:**
|
||||
- `token`: token密钥(必需)
|
||||
- `encryptedData`: 加密的数据(必需)
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "解密成功",
|
||||
"data": "https://example.com/user/123"
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 验证并解密二维码内容
|
||||
|
||||
```http
|
||||
POST /api/qr-code/verify-and-decrypt-qr
|
||||
```
|
||||
|
||||
**参数:**
|
||||
- `qrContent`: 二维码扫描得到的完整JSON内容(必需)
|
||||
|
||||
**二维码内容格式:**
|
||||
```json
|
||||
{
|
||||
"token": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
|
||||
"data": "encrypted_data_here",
|
||||
"type": "encrypted"
|
||||
}
|
||||
```
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "验证和解密成功",
|
||||
"data": "https://example.com/user/123"
|
||||
}
|
||||
```
|
||||
|
||||
### 6. 检查token是否有效
|
||||
|
||||
```http
|
||||
GET /api/qr-code/check-token?token=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
|
||||
```
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "检查完成",
|
||||
"data": true
|
||||
}
|
||||
```
|
||||
|
||||
### 7. 使token失效
|
||||
|
||||
```http
|
||||
POST /api/qr-code/invalidate-token
|
||||
```
|
||||
|
||||
**参数:**
|
||||
- `token`: 要使失效的token(必需)
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "token已失效"
|
||||
}
|
||||
```
|
||||
|
||||
## 使用场景
|
||||
|
||||
### 场景1:用户身份验证二维码
|
||||
|
||||
```javascript
|
||||
// 生成包含用户ID的加密二维码
|
||||
const response = await fetch('/api/qr-code/create-encrypted-qr-code', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
body: 'data=user_id:12345&expireMinutes=10'
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
// 显示二维码图片:result.data.qrCodeBase64
|
||||
// 保存token用于后续验证:result.data.token
|
||||
```
|
||||
|
||||
### 场景2:临时访问链接
|
||||
|
||||
```javascript
|
||||
// 生成临时访问链接的二维码
|
||||
const accessUrl = 'https://example.com/temp-access?session=abc123';
|
||||
const response = await fetch('/api/qr-code/create-encrypted-qr-image?' +
|
||||
new URLSearchParams({
|
||||
data: accessUrl,
|
||||
size: '250x250',
|
||||
expireMinutes: '5'
|
||||
}));
|
||||
|
||||
// 直接使用返回的图片流
|
||||
// token信息在响应头 X-QR-Token 中
|
||||
```
|
||||
|
||||
### 场景3:扫码验证
|
||||
|
||||
```javascript
|
||||
// 扫描二维码后验证
|
||||
const qrContent = '{"token":"...","data":"...","type":"encrypted"}';
|
||||
const response = await fetch('/api/qr-code/verify-and-decrypt-qr', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
body: 'qrContent=' + encodeURIComponent(qrContent)
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
if (result.code === 200) {
|
||||
console.log('原始数据:', result.data);
|
||||
} else {
|
||||
console.log('验证失败:', result.message);
|
||||
}
|
||||
```
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
1. **token保护**:token是解密的关键,应妥善保管
|
||||
2. **过期时间**:根据安全需求设置合适的过期时间
|
||||
3. **HTTPS传输**:生产环境中应使用HTTPS传输
|
||||
4. **访问控制**:可根据需要添加接口访问权限控制
|
||||
5. **日志记录**:建议记录二维码生成和验证的操作日志
|
||||
|
||||
## 错误处理
|
||||
|
||||
常见错误及处理:
|
||||
|
||||
- `token已过期或无效`:二维码已过期,需要重新生成
|
||||
- `数据验证失败`:加密数据被篡改或token不匹配
|
||||
- `尺寸必须在50-1000像素之间`:二维码尺寸超出允许范围
|
||||
- `过期时间必须在1-1440分钟之间`:过期时间设置不合理
|
||||
Reference in New Issue
Block a user