По какой-то причине я борюсь с генерацией подписи для моей политики загрузки Amazon S3. Клянусь, когда-то это работало, но больше не работает. Любая помощь приветствуется. Мне нужен свежий взгляд.
При сравнении с результатами Amazon S3 Signature Tester , я не получаю ту же подпись. Однако, когда я напрямую использую подпись этого инструмента, все работает нормально. Так что проблема определенно в моем процессе подписания. Кроме того, шестнадцатеричное декодирование «Строка для подписи», выходящая из этого инструмента, идентично моей подписываемой политике ввода.
В документах AWS говорится , что процесс создания сигнатуры политики должен происходить следующим образом:
Выглядит достаточно прямолинейно. Единственное место для двусмысленности может быть в № 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 */);