java - Java 中的 Amazon S3 策略签名

标签 java amazon-s3 sha1 hmac

出于某种原因,我正在努力为我的 Amazon S3 上传策略生成签名。我发誓我曾经有过这个工作,但现在没有了。任何帮助将非常感激。我需要一双全新的眼睛。

Amazon S3 Signature Tester 的输出进行比较时,我没有得到相同的签名。但是,当我直接使用该工具的签名时,一切正常。所以问题肯定出在我的签名过程中。此外,该工具输出的“待签名字符串”十六进制解码与我正在签名的输入策略相同。

AWS 文档说 the process for constructing a policy signature应该是这样的:

  1. 使用 UTF-8 对政策进行编码。
  2. 使用 Base64 对这些 UTF-8 字节进行编码。
  3. 使用 HMAC SHA-1 使用您的 secret 访问 key 签署政策。
  4. 使用 Base64 对 SHA-1 签名进行编码。

看起来很简单。唯一有歧义的地方可能是#3。 AWS 文档显示 a sample snippet for generating HMAC-SHA1这与 other Java cryptography examples 一致我见过。

我正在使用 Base64 的 Apache Commons 实现的 v1.6。我的签名代码基本上是这样的:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

/* ... */

private static final String UTF8 = "UTF-8";
private static final String HMACSHA1 = "HmacSHA1";

public static String sign(String secret, String data) {
    byte[] dataBytes = data.getBytes(UTF8);
    byte[] secretBytes = secret.getBytes(UTF8);

    SecretKeySpec signingKey = new SecretKeySpec(secretBytes, HMACSHA1);

    Mac mac = Mac.getInstance(HMACSHA1);
    mac.init(signingKey);
    byte[] signature = mac.doFinal(dataBytes);

    return Base64.encodeBase64String(signature);
}

然后我对这个签名的用法如下:

String signature = sign(
    /* AWS Secret Access Key copied directly out of the AWS Console */,
    /* policy properly serialized as JSON */);

最佳答案

好的,我找到了。显然今天我已经有效地跳过了第 2 步。我确实将策略 JSON 编码为 Base64,但随后我直接签署了 JSON 字符串而不是 Base64 字符串。

第 3 步可能应该改写为“使用 HMAC SHA-1 使用您的 secret 访问 key 签署 Base64 策略。”

我想我会保留它,以防其他人遇到类似问题。

关于java - Java 中的 Amazon S3 策略签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750074/

相关文章:

Java 8 SSL 握手失败

java - 移动 TextView 框使我的 Android 应用程序崩溃

python - 无法导入 "hashlib"

sha1 - Signtool 双重签名失败

mysql - 如何存储密码盐

Java执行流引擎

java - 其余搜索参数验证

ios - 将图像从S3存储桶加载到uiTableView

amazon-s3 - 附加管理员策略的爬网程序的 AWS Glue 访问被拒绝

java - AWS SDK无法读取环境变量