По какой-то причине я борюсь с созданием подписи для моей политики загрузки Amazon S3. Я клянусь, у меня это работало однажды, но больше не. Любая помощь приветствуется. Мне нужен свежий набор глаз.
При сравнении с Amazon S3 Signature Tester я не получаю такую же подпись. Однако, когда я напрямую использую подпись, исходящую от этого инструмента, все работает отлично. Так что проблема определенно в моем процессе подписания. Кроме того, шестнадцатеричное декодирование строки для подписи, полученное из этого инструмента, идентично моей подписанной политике ввода.
Документы AWS говорят , что процесс создания сигнатуры политики должен выглядеть следующим образом:
- Кодировать политику с использованием UTF-8.
- Кодировать эти байты UTF-8, используя Base64.
- Подпишите политику с помощью секретного ключа доступа, используя HMAC SHA-1.
- Кодирование подписи SHA-1 с использованием Base64.
Кажется, достаточно просто. Единственное место для двусмысленности может быть в # 3. Документы AWS показывают образец фрагмента для генерации HMAC-SHA1 , и это согласуется с другими примерами криптографии Java , которые я видел.
Я использую v1.6 реализации Apache Commons Base64. Мой код подписи в основном выглядит так:
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 */);