API签名工具 - C#实现
本目录包含API签名机制的C#语言实现,提供了签名计算与验证的完整功能。
功能特点
- 支持多种签名算法(MD5, SHA1, SHA256, HMAC-SHA256)
- 支持自定义签名参数名称
- 支持URL参数签名
- 内置防重放攻击机制(时间戳+nonce)
- 跨平台(.NET Standard 2.0 兼容)
- 提供命令行工具进行测试
- 无外部依赖,仅使用.NET标准库
项目结构
根据实际项目文件结构:
csharp/
├── src/
│ ├── ApiSigner/
│ │ ├── ApiSigner.cs # 签名工具实现
│ │ ├── ApiSigner.csproj # 项目文件
│ │ ├── SignatureAlgorithm.cs # 签名算法定义
│ │ ├── SignOptions.cs # 签名配置
│ │ └── SignVerifyResult.cs # 验证结果类型
│ │
│ ├── ApiSigner.Cli/
│ │ ├── ApiSigner.Cli.csproj # 命令行项目文件
│ │ └── Program.cs # 命令行入口
│ │
│ └── ApiSigner.sln # 解决方案文件
使用方法
构建项目
dotnet build src/ApiSigner.sln
运行命令行工具
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj [选项]
命令行选项
| 选项 | 描述 |
|---|---|
-a, --algorithm |
签名算法: MD5, SHA1, SHA256, HMAC-SHA256 |
-u, --url |
API基础URL |
-p, --param |
请求参数,格式为key=value,可多次使用 |
-k, --key |
访问密钥ID |
-s, --secret |
密钥 |
-c, --channel |
合作渠道方ID |
-h, --help |
显示帮助信息 |
常用命令示例
基本用法
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj
自定义参数
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj \
-u "https://api.example.com/user/info" \
-p "userId=12345" -p "action=getInfo" \
-k "YOUR_ACCESS_KEY" \
-s "YOUR_SECRET_KEY" \
-c "3"
指定签名算法
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj -a SHA256
帮助信息
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj --help
API接口测试实例
使用真实API接口进行测试:
# 未签名的API调用测试 - 返回错误
curl "https://api-v1.sound-force.com:8443/p/album/single/media-url?channelId=3&singleId=381980"
# 返回: {"code":400,"data":null,"msg":"Missing AccessKeyId","success":false}
# 生成访问https://api-v1.sound-force.com:8443/p/album/single/media-url的签名URL
dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj \
-a MD5 \
-u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \
-p "singleId=381980" \
-k "YOUR_ACCESS_KEY" \
-s "YOUR_SECRET_KEY" \
-c "3"
# 使用curl测试API接口
signedUrl=$(dotnet run --project src/ApiSigner.Cli/ApiSigner.Cli.csproj \
-a MD5 \
-u "https://api-v1.sound-force.com:8443/p/album/single/media-url" \
-p "singleId=381980" \
-k "YOUR_ACCESS_KEY" \
-s "YOUR_SECRET_KEY" \
-c "3" | grep -A 1 "签名后的URL:" | tail -n 1)
curl -v "$signedUrl"
请注意:
- 替换
YOUR_ACCESS_KEY为实际的访问密钥ID - 替换
YOUR_SECRET_KEY为实际的密钥 - 示例使用的渠道ID为
3,请根据实际情况调整
使用有效的密钥和签名后,API接口将返回成功响应(状态码200)并提供媒体URL数据。
代码集成
using SoundForce.ApiSigner;
// 创建签名选项
var options = new SignOptions { Algorithm = SignatureAlgorithm.Md5 };
// 创建签名工具
var signer = new ApiSigner(options);
// 准备请求参数
var parameters = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{
["singleId"] = "381980"
};
// 执行签名
var signedParams = signer.SignRequest(
parameters,
"YOUR_ACCESS_KEY",
"YOUR_SECRET_KEY",
"3"
);
// 或签名URL
var signedUrl = signer.SignUrl(
"https://api-v1.sound-force.com:8443/p/album/single/media-url",
parameters,
"YOUR_ACCESS_KEY",
"YOUR_SECRET_KEY",
"3"
);
环境变量
该工具支持从.env文件加载以下配置:
ACCESS_KEY_ID: 访问密钥IDSECRET_KEY: 密钥CHANNEL_ID: 渠道IDSIGN_ALGORITHM: 签名算法API_BASE_URL: API基础URL
注意事项
- 在生产环境中,应该妥善保管SecretKey,不要硬编码在代码中
- 服务端需要自行实现nonce存储与验证以防止重放攻击
- 时间戳验证需要考虑服务器与客户端之间可能存在的时间差
- 默认情况下,命令行工具从
.env文件或环境变量读取配置