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('&');
}

使用说明

基本使用

  1. 配置密钥

    • 输入Secret Key
    • 确保密钥安全
    • 定期更换密钥
  2. 输入参数

    • 输入请求参数JSON
    • 确保参数完整
    • 检查参数格式
  3. 生成签名

    • 选择签名算法
    • 配置签名选项
    • 生成签名结果

高级功能

批量签名

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请求的安全性和完整性。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐