Подписание политик Amazon S3 на Java

По какой-то причине я борюсь с генерацией подписи для моей политики загрузки Amazon S3. Клянусь, когда-то это работало, но больше не работает. Любая помощь приветствуется. Мне нужен свежий взгляд.

При сравнении с результатами Amazon S3 Signature Tester , я не получаю ту же подпись. Однако, когда я напрямую использую подпись этого инструмента, все работает нормально. Так что проблема определенно в моем процессе подписания. Кроме того, шестнадцатеричное декодирование «Строка для подписи», выходящая из этого инструмента, идентично моей подписываемой политике ввода.

В документах AWS говорится , что процесс создания сигнатуры политики должен происходить следующим образом:

  1. Закодируйте политику, используя UTF-8.
  2. Кодируйте эти байты UTF-8 с помощью Base64.
  3. Подпишите политику своим секретным ключом доступа, используя HMAC SHA-1.
  4. Закодируйте подпись SHA-1 с помощью Base64.

Выглядит достаточно прямолинейно. Единственное место для двусмысленности может быть в № 3. Документы AWS показывают образец фрагмента для генерации HMAC-SHA1 , и он согласуется с другими примерами криптографии Java , которые я видел.

Я использую версию 1.6 из реализации Base64 Apache Commons.Мой код подписи в основном выглядит так:

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 */);

7
задан Ilmari Karonen 3 November 2013 в 15:10
поделиться