Flutter 鸿蒙请求签名验证实现:签名算法与参数处理
✅ 多种签名算法支持✅ 参数处理机制✅ 时间戳验证✅ 防重放攻击✅ 签名验证功能该功能为Flutter for OpenHarmony应用提供了可靠的请求安全保障,确保API请求的安全性和完整性。
·
Flutter 鸿蒙请求签名验证实现:签名算法与参数处理
欢迎加入开源鸿蒙跨平台社区! https://openharmonycrossplatform.csdn.net
效果展示


请求签名演示
签名生成
- 输入请求参数
- 选择签名算法
- 配置签名选项
- 生成签名结果
签名验证
- 验证签名有效性
- 检查参数完整性
- 防止参数篡改
- 确保请求安全
签名过程展示
参数处理
- 参数排序
- 添加时间戳
- 添加随机数
- 拼接签名字符串
签名计算
- 选择签名算法
- 使用密钥签名
- 生成签名值
- 显示签名结果
实现步骤
1. 签名生成器实现
核心类设计
class SignatureGenerator {
final String secretKey;
String generate(Map<String, dynamic> params) {
// 1. 参数排序
final sortedParams = _sortParams(params);
// 2. 添加时间戳
sortedParams['timestamp'] = DateTime.now()
.millisecondsSinceEpoch.toString();
// 3. 添加随机数
sortedParams['nonce'] = _generateNonce();
// 4. 拼接字符串
final stringToSign = _buildString(sortedParams);
// 5. 生成签名
final signature = _hmacSha256(stringToSign, secretKey);
return signature;
}
}
2. 参数处理
参数排序
Map<String, dynamic> _sortParams(Map<String, dynamic> params) {
final sortedKeys = params.keys.toList()..sort();
final sortedParams = <String, dynamic>{};
for (var key in sortedKeys) {
sortedParams[key] = params[key];
}
return sortedParams;
}
字符串拼接
String _buildString(Map<String, dynamic> params) {
final parts = <String>[];
params.forEach((key, value) {
parts.add('$key=$value');
});
return parts.join('&');
}
3. 签名算法实现
HMAC-SHA256
String _hmacSha256(String data, String key) {
final hmac = Hmac(sha256, utf8.encode(key));
final digest = hmac.convert(utf8.encode(data));
return digest.toString();
}
MD5
String _md5Hash(String data) {
final digest = md5.convert(utf8.encode(data));
return digest.toString();
}
SHA256
String _sha256Hash(String data) {
final digest = sha256.convert(utf8.encode(data));
return digest.toString();
}
4. 签名验证
验证逻辑
bool verify(String signature, Map<String, dynamic> params) {
final expected = generate(params);
return signature == expected;
}
时间戳验证
bool isTimestampValid(String timestamp) {
final time = int.parse(timestamp);
final now = DateTime.now().millisecondsSinceEpoch;
final difference = (now - time).abs();
return difference < 300000; // 5分钟内有效
}
功能特性
1. 签名配置
算法选择
enum SignatureMethod {
hmacSha256,
md5,
sha256,
}
String generateSignature(
String data,
String key,
SignatureMethod method,
) {
switch (method) {
case SignatureMethod.hmacSha256:
return _hmacSha256(data, key);
case SignatureMethod.md5:
return _md5Hash(data + key);
case SignatureMethod.sha256:
return _sha256Hash(data + key);
}
}
选项配置
class SignatureConfig {
bool includeTimestamp = true;
bool includeNonce = true;
int timestampTolerance = 300000; // 5分钟
SignatureMethod method = SignatureMethod.hmacSha256;
}
2. 随机数生成
Nonce生成
String _generateNonce() {
final random = Random.secure();
final values = List<int>.generate(16, (i) => random.nextInt(256));
return base64UrlEncode(values).substring(0, 16);
}
防重放攻击
final Set<String> _usedNonces = {};
bool isNonceValid(String nonce) {
if (_usedNonces.contains(nonce)) {
return false;
}
_usedNonces.add(nonce);
_cleanOldNonces();
return true;
}
3. 参数处理
参数过滤
Map<String, dynamic> filterParams(Map<String, dynamic> params) {
return params.map((key, value) {
if (value == null || value.toString().isEmpty) {
return MapEntry(key, null);
}
return MapEntry(key, value);
})..removeWhere((key, value) => value == null);
}
参数编码
String encodeParams(Map<String, dynamic> params) {
return params.entries
.map((e) => '${e.key}=${Uri.encodeComponent(e.value.toString())}')
.join('&');
}
使用说明
基本使用
-
配置密钥
- 输入Secret Key
- 确保密钥安全
- 定期更换密钥
-
输入参数
- 输入请求参数JSON
- 确保参数完整
- 检查参数格式
-
生成签名
- 选择签名算法
- 配置签名选项
- 生成签名结果
高级功能
批量签名
Map<String, String> signRequests(
List<Map<String, dynamic>> requests,
) {
final signatures = <String, String>{};
for (var request in requests) {
final signature = generate(request);
signatures[request['id']] = signature;
}
return signatures;
}
签名缓存
final Map<String, String> _signatureCache = {};
String getCachedSignature(Map<String, dynamic> params) {
final key = _buildCacheKey(params);
if (_signatureCache.containsKey(key)) {
return _signatureCache[key]!;
}
final signature = generate(params);
_signatureCache[key] = signature;
return signature;
}
技术要点
1. 安全性考虑
密钥管理
- 密钥安全存储
- 定期更换密钥
- 不同环境不同密钥
- 密钥权限控制
签名安全
- 使用强加密算法
- 防止重放攻击
- 时间戳验证
- 随机数防重放
2. 性能优化
签名缓存
- 缓存相同参数签名
- 设置缓存过期时间
- 及时清理缓存
批量处理
- 批量签名优化
- 并行签名计算
- 异步签名处理
3. 错误处理
签名错误
try {
final signature = generate(params);
} on InvalidParamsException {
// 参数错误
} on KeyNotFoundException {
// 密钥未找到
} catch (e) {
// 其他错误
}
最佳实践
1. 密钥管理
安全存储
class KeyManager {
Future<void> saveKey(String key) async {
final encrypted = await encrypt(key);
await secureStorage.write('api_key', encrypted);
}
Future<String> getKey() async {
final encrypted = await secureStorage.read('api_key');
return await decrypt(encrypted);
}
}
2. 签名验证
服务端验证
bool verifyRequest(Request request) {
final signature = request.headers['X-Signature'];
final timestamp = request.headers['X-Timestamp'];
final nonce = request.headers['X-Nonce'];
// 验证时间戳
if (!isTimestampValid(timestamp)) {
return false;
}
// 验证随机数
if (!isNonceValid(nonce)) {
return false;
}
// 验证签名
final expected = generate(request.params);
return signature == expected;
}
3. 日志记录
签名日志
void logSignature(
String signature,
Map<String, dynamic> params,
) {
logger.info({
'signature': signature,
'params': params,
'timestamp': DateTime.now(),
});
}
应用场景
1. API请求签名
请求拦截器
class SignatureInterceptor extends Interceptor {
Future<Request> onRequest(Request request) async {
final signature = generateSignature(request.params);
request.headers['X-Signature'] = signature;
return request;
}
}
2. 支付签名
支付请求签名
String signPayment(PaymentRequest payment) {
final params = {
'order_id': payment.orderId,
'amount': payment.amount,
'currency': payment.currency,
'timestamp': DateTime.now().millisecondsSinceEpoch,
};
return generate(params);
}
3. 数据完整性验证
文件签名
String signFile(File file) async {
final bytes = await file.readAsBytes();
final digest = sha256.convert(bytes);
return digest.toString();
}
总结
Flutter鸿蒙请求签名验证功能实现了完整的请求安全解决方案,包括:
- ✅ 多种签名算法支持
- ✅ 参数处理机制
- ✅ 时间戳验证
- ✅ 防重放攻击
- ✅ 签名验证功能
该功能为Flutter for OpenHarmony应用提供了可靠的请求安全保障,确保API请求的安全性和完整性。
更多推荐


所有评论(0)