You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中计算AWS S3 API的HMAC签名遇问题求助

AWS S3 v4签名计算错误修正方案

你遇到的问题核心是AWS v4签名密钥生成的两个关键细节处理错误,以下是针对两种实现的修正:

第一种实现(cryptography包)问题:缺少AWS4前缀

AWS v4签名的第一步要求把原始SecretKey前缀加上AWS4,你的代码直接使用了原始密钥,导致后续所有HMAC计算错误。

修正后的代码片段:

var hmac = c.Hmac.sha256();

// 关键修正:给SecretKey添加AWS4前缀
var dateKey = await hmac.calculateMac(
  utf8.encode("20130524"),
  secretKey: c.SecretKey(utf8.encode("AWS4$secretKey"))
);
var regionKey = await hmac.calculateMac(
  utf8.encode("us-east-1"),
  secretKey: c.SecretKey(dateKey.bytes)
);
var regionServiceKey = await hmac.calculateMac(
  utf8.encode("s3"),
  secretKey: c.SecretKey(regionKey.bytes)
);
var signingKey = await hmac.calculateMac(
  utf8.encode("aws4_request"),
  secretKey: c.SecretKey(regionServiceKey.bytes)
);

var signature = await hmac.calculateMac(
  utf8.encode(stringToSign),
  secretKey: c.SecretKey(signingKey.bytes)
);
var signatureString = hex.encode(signature.bytes);

第二种实现(crypto包)问题:错误使用Digest.toString()

每次HMAC计算后,你把Digest对象转成十六进制字符串再作为下一次的密钥,但AWS要求传递的是HMAC生成的原始二进制字节,而非字符串形式。

修正后的代码片段:

var dateKey = getHmac256Digest(
    utf8.encode("AWS4$secretKey"), utf8.encode("20130524"));
// 关键修正:使用Digest.bytes而非toString()
var dateRegionKey = getHmac256Digest(
    dateKey.bytes, utf8.encode('us-east-1'));
var dateRegionServiceKey = getHmac256Digest(
    dateRegionKey.bytes, utf8.encode('s3'));
var signingKey = getHmac256Digest(
    dateRegionServiceKey.bytes,
    utf8.encode('aws4_request'));
var signature = getHmac256Digest(
    signingKey.bytes,
    utf8.encode(stringToSign));

Digest getHmac256Digest(List<int> encodingKey, List<int> hashValue) {
    return Hmac(sha256, encodingKey).convert(hashValue);
}

关键注意点

  • AWS v4签名密钥生成必须严格遵循层级:AWS4<SecretKey → 日期 → 区域 → 服务 → aws4_request,每一步都要传递二进制字节
  • 绝对不能将中间HMAC结果转成十六进制字符串再参与计算,必须用原始字节
  • 确认StringToSign的SHA256哈希是正确的(你已验证过这一步,重点在密钥生成链)

修正后两种实现都能得到正确签名:f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41

内容的提问来源于stack exchange,提问作者nolnah93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:23:12