Z jakiegoś powodu zmagam się z generacją sygnatur dla mojej polityki przesyłania Amazon S3. Przysięgam, że działałem w pewnym momencie, ale już nie. Każda pomoc byłaby bardzo cenna. Potrzebuję świeżego zestawu oczu.Podpisanie Polityki Amazon S3 w Javie
W przypadku porównania z wynikiem z Amazon S3 Signature Tester, jestem , a nie uzyskiwanie tego samego podpisu. Jednak kiedy bezpośrednio używam podpisu wychodzącego z tego narzędzia, wszystko działa dobrze. Tak więc problem jest zdecydowanie w moim procesie podpisywania. Ponadto, "Dekodowany łańcuch szesnastkowy" pochodzący z tego narzędzia jest identyczny z moją sygnaturą wejściową, która jest podpisywana.
Docs AWS powiedzieć the process for constructing a policy signature powinno iść tak:
- Koduje polityka użyciu UTF-8.
- Zakoduj te bajty UTF-8, używając Base64.
- Podpowiedz zasady za pomocą tajnego klucza dostępu za pomocą HMAC SHA-1.
- Zakoduj sygnaturę SHA-1 za pomocą Base64.
wydaje się dość prosta. Jedynym miejscem na dwuznaczność może być # 3. Dokumenty AWS pokazują a sample snippet for generating HMAC-SHA1 i jest to zgodne z other Java cryptography examples, które widziałem.
Używam v1.6 Apache Commons realizacji Base64. Mój kod podpisanie zasadniczo wygląda następująco:
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);
}
I wtedy mój wykorzystania tego podpisania wygląda następująco:
String signature = sign(
/* AWS Secret Access Key copied directly out of the AWS Console */,
/* policy properly serialized as JSON */);