Vì một số lý do, tôi đang đấu tranh với việc tạo chữ ký cho chính sách tải lên Amazon S3 của tôi. Tôi thề rằng tôi đã làm việc này tại một thời điểm nhưng không còn nữa. Bất kì sự trợ giúp nào đều được đánh giá cao. Tôi cần một bộ mắt mới.Chính sách Amazon S3 Đăng nhập bằng Java
Khi so sánh với đầu ra từ Amazon S3 Signature Tester, tôi là không phải là có chữ ký giống nhau. Tuy nhiên, khi tôi trực tiếp sử dụng chữ ký sắp ra của công cụ đó, mọi thứ đều hoạt động tốt. Vì vậy, vấn đề là chắc chắn trong quá trình ký kết của tôi. Ngoài ra, giải mã thập lục phân "Chuỗi được ký" sắp ra khỏi công cụ đó giống hệt với chính sách nhập của tôi được ký.
Các tài liệu AWS nói the process for constructing a policy signature nên đi như thế này:
- Mã hóa các chính sách sử dụng UTF-8.
- Mã hóa các byte UTF-8 đó bằng Base64.
- Ký chính sách bằng Khóa truy cập bí mật của bạn bằng HMAC SHA-1.
- Mã hóa chữ ký SHA-1 bằng Base64.
Dường như đủ về phía trước. Nơi duy nhất cho sự mơ hồ có thể ở vị trí thứ 3. Tài liệu AWS hiển thị a sample snippet for generating HMAC-SHA1 và điều này phù hợp với other Java cryptography examples Tôi đã xem.
Tôi đang sử dụng v1.6 triển khai Apache Commons của Base64. mã ký của tôi về cơ bản trông như thế này:
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);
}
Và sau đó sử dụng của tôi ký này trông giống như:
String signature = sign(
/* AWS Secret Access Key copied directly out of the AWS Console */,
/* policy properly serialized as JSON */);