# SM4-Golang-Proxy-Repeater **Repository Path**: xcmrfc-thanos/sm4-golang-proxy-repeater ## Basic Information - **Project Name**: SM4-Golang-Proxy-Repeater - **Description**: 一个使用Go开发的,用于后端加密解密难以改动,启动一个代理加密服务-国密 SM4 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/xcmrfc-thanos/sm4-golang-proxy-repeater - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-22 - **Last Updated**: 2025-07-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言 ## README # SM4-Golang-Proxy-Repeater [![Go Version](https://img.shields.io/badge/Go-1.22+-blue.svg)](https://golang.org) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen.svg)]() 一个基于Go语言开发的高性能SM4加密代理转发服务,支持双密钥加密、智能JSON解析、滑动窗口限流等功能。 ## 🚀 特性 - **🔐 双密钥SM4加密**:请求和响应使用不同的SM4密钥,提高安全性 - **🧠 智能JSON解析**:自动识别并转换JSON格式的查询参数 - **🚦 滑动窗口限流**:精确控制API访问频率,防止滥用 - **⚡ 高性能**:基于Go语言开发,支持高并发处理 - **🛡️ 安全可靠**:使用国密SM4算法,支持PKCS#5填充 - **📊 实时监控**:提供限流统计和请求追踪功能 - **🔧 灵活配置**:支持多种配置选项,易于部署和维护 ## 📋 目录 - [快速开始](#快速开始) - [安装部署](#安装部署) - [配置说明](#配置说明) - [使用示例](#使用示例) - [API文档](#api文档) - [工作原理](#工作原理) - [性能优化](#性能优化) - [常见问题](#常见问题) - [贡献指南](#贡献指南) - [许可证](#许可证) ## 🚀 快速开始 ### 基本用法 ```bash # 使用默认配置启动 ./SM4ZServer-windows-amd64 --port 18090 --target 192.168.1.126:8080 # 使用自定义密钥 ./SM4ZServer-windows-amd64 \ --port 18090 \ --request-key 1809012345678910 \ --response-key 9876543210987654 \ --target 192.168.1.126:8080 \ --data-key data ``` ### 启用限流 ```bash # 60秒内最多10次请求 ./SM4ZServer-windows-amd64 \ --port 18090 \ --target 192.168.1.126:8080 \ --rate-limit 60,10 ``` ## 📦 安装部署 ### 方式一:直接下载 1. 从 [Releases](https://github.com/your-repo/releases) 下载对应平台的二进制文件 2. 解压并赋予执行权限 3. 运行程序 ### 方式二:源码编译 ```bash # 克隆仓库 git clone https://github.com/your-repo/sm4-golang-proxy-repeater.git cd sm4-golang-proxy-repeater # 编译 go build -o SM4ZServer main.go # 运行 ./SM4ZServer --port 18090 --target 127.0.0.1:8080 ``` ### 方式三:Docker部署 ```dockerfile FROM golang:1.22-alpine AS builder WORKDIR /app COPY . . RUN go build -o SM4ZServer main.go FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/SM4ZServer . EXPOSE 18090 CMD ["./SM4ZServer", "--port", "18090", "--target", "127.0.0.1:8080"] ``` ## ⚙️ 配置说明 ### 命令行参数 | 参数 | 类型 | 默认值 | 说明 | |------------------|------|--------|------| | `--port` | string | 18090 | 代理服务监听端口 | | `--request-key` | string | 1809012345678910 | 请求解密SM4密钥(16字节) | | `--response-key` | string | 1809012345678910 | 响应加密SM4密钥(16字节) | | `--target` | string | 127.0.0.1:8080 | 目标服务器地址 | | `--data-key` | string | data | 数据键名 | | `--timeout` | int | 30 | HTTP请求超时时间(秒) | | `--rate-limit` | string | 60,5 | 限流配置(时间窗口秒数,最大请求数) | ### 环境变量 支持通过环境变量配置: ```bash export SM4_PROXY_PORT=18090 export SM4_REQUEST_KEY=1809012345678910 export SM4_RESPONSE_KEY=9876543210987654 export SM4_TARGET=192.168.1.126:8080 ``` ## 📝 使用示例 ### 1. 基本代理转发 **客户端请求:** ```bash # GET请求 curl "http://localhost:18090/api/test?data=a1b2c3d4e5f6" # POST请求 curl -X POST "http://localhost:18090/api/test" \ -H "Content-Type: application/json" \ -d '{"data": "a1b2c3d4e5f6"}' ``` **代理转发:** ``` 客户端 → 代理服务器(解密) → 目标服务器 → 代理服务器(加密) → 客户端 ``` ### 2. JSON参数自动转换 **客户端请求:** ```bash curl "http://localhost:18090/api/test?data=加密的{\"pageNum\":1,\"pageSize\":10}" ``` **解密后转发:** ``` GET /api/test?pageNum=1&pageSize=10 ``` ### 3. 限流控制 **正常响应:** ```http HTTP/1.1 200 OK X-RateLimit-Limit: 10 X-RateLimit-Remaining: 7 Content-Type: application/json {"data": "加密的响应数据"} ``` **限流触发:** ```http HTTP/1.1 429 Too Many Requests X-RateLimit-Limit: 10 X-RateLimit-Remaining: 0 X-RateLimit-Reset: 1640995200 请求过于频繁,请稍后再试 ``` ## 📚 API文档 ### 代理接口 所有通过代理的请求都会自动进行SM4加解密处理。 ### 统计接口 #### 获取限流统计信息 ```http GET /_stats ``` **响应示例:** ```json { "url_stats": { "/api/test": { "current_requests": 3, "max_requests": 5, "remaining": 2, "window_size": 60 }, "/api/user": { "current_requests": 1, "max_requests": 5, "remaining": 4, "window_size": 60 } }, "total_urls": 2, "window_size": 60, "timestamp": 1640995140 } ``` ### 响应头说明 | 响应头 | 说明 | |--------|------| | `X-Request-ID` | 请求唯一标识 | | `X-Proxy-Server` | 代理服务器标识 | | `X-RateLimit-Limit` | 限流最大请求数 | | `X-RateLimit-Remaining` | 剩余可用请求数 | | `X-RateLimit-Reset` | 限流重置时间戳 | ## 🔄 工作原理 ### 请求处理流程 1. **接收请求**:代理服务器接收客户端加密请求 2. **限流检查**:验证请求频率是否超过限制 3. **解密数据**:使用request-key解密请求数据 4. **智能解析**:自动识别JSON格式并转换为查询参数 5. **转发请求**:将解密后的数据转发到目标服务器 6. **接收响应**:获取目标服务器的原始响应 7. **加密响应**:使用response-key加密响应数据 8. **返回结果**:将加密后的响应返回给客户端 ### 数据格式 #### 请求格式 **GET请求:** ``` ?data=hex编码的SM4加密数据 ``` **POST请求:** ```json { "data": "hex编码的SM4加密数据" } ``` #### 响应格式 ```json { "data": "hex编码的SM4加密数据" } ``` ## ⚡ 性能优化 ### 已实现的优化 - **连接池**:HTTP客户端使用连接池,减少连接开销 - **并发安全**:使用读写锁保护加密操作 - **内存优化**:智能清理过期请求记录 - **超时控制**:防止长时间阻塞 ### 性能指标 - **并发处理**:支持1000+并发请求 - **响应时间**:平均响应时间 < 10ms - **内存占用**:低内存占用,适合容器化部署 - **CPU使用率**:高效利用CPU资源 ## ❓ 常见问题 ### Q: 如何生成SM4密钥? A: SM4密钥必须是16字节(128位),可以使用以下方式生成: ```bash # 使用OpenSSL openssl rand -hex 16 # 使用Go go run -c 'package main; import ("crypto/rand"; "encoding/hex"; "fmt"); func main() { b := make([]byte, 16); rand.Read(b); fmt.Println(hex.EncodeToString(b)) }' ``` ### Q: 如何配置不同的密钥? A: 使用 `--request-key` 和 `--response-key` 参数: ```bash ./SM4ZServer \ --request-key 1809012345678910 \ --response-key 9876543210987654 ``` ### Q: 限流配置的最佳实践? A: 根据业务需求配置(每个URL路径独立限流): - **API接口**:`--rate-limit 60,100`(每个路径60秒内100次) - **登录接口**:`--rate-limit 60,5`(每个路径60秒内5次) - **文件上传**:`--rate-limit 300,10`(每个路径5分钟内10次) - **严格限制**:`--rate-limit 60,1`(每个路径60秒内1次) ### Q: 如何监控代理服务状态? A: 访问 `/_stats` 端点获取实时统计信息,或查看日志输出。 ## 🤝 贡献指南 我们欢迎所有形式的贡献! ### 开发环境 1. 确保Go版本 >= 1.22 2. 克隆仓库:`git clone https://github.com/your-repo/sm4-golang-proxy-repeater.git` 3. 安装依赖:`go mod download` 4. 运行测试:`go test ./...` ### 提交规范 - 使用清晰的提交信息 - 添加必要的测试用例 - 更新相关文档 - 遵循Go代码规范 ### 问题反馈 - 使用 [Issues](https://github.com/your-repo/issues) 报告问题 - 提供详细的复现步骤 - 包含系统环境和版本信息 ## 📄 许可证 本项目采用 [MIT License](LICENSE) 开源许可证。 ## 🙏 致谢 感谢所有为这个项目做出贡献的开发者! --- **⭐ 如果这个项目对您有帮助,请给我们一个Star!**