Я сделал еще одну минималистическую оболочку с только 20 строками кода, чтобы разрешить ее использовать, как и должно:
localStorage.set('myKey',{a:[1,2,5], b: 'ok'});
localStorage.has('myKey'); // --> true
localStorage.get('myKey'); // --> {a:[1,2,5], b: 'ok'}
localStorage.keys(); // --> ['myKey']
localStorage.remove('myKey');
Вы не можете вызывать предварительно подписанный URL-адрес напрямую через браузер.
Вам необходимо передавать заголовки в запросе
x-amz-server-side-encryption- алгоритм клиента
x-amz-шифрование на стороне сервера-ключ клиента
шифрование на стороне сервера x-amz -Customer-key-MD5
Пожалуйста, проверьте документ для получения дополнительной информации https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html
При использовании предварительно назначенного URL-адреса для загрузки нового объекта, извлечения существующего объекта или извлечения только метаданных объекта необходимо предоставить все заголовки шифрования в клиентском приложении.
blockquote>Пожалуйста, проверьте пример кода, вызывающего подписанный URL через библиотеку Unirest https://github.com/pavanpawar4591/s3signurlwith-sse-c
public static void getPreSignedURL() throws URISyntaxException { java.util.Date expiration = new java.util.Date(); long expTimeMillis = expiration.getTime(); expTimeMillis += 1000 * 60 * 60; expiration.setTime(expTimeMillis); System.out.println("Generating pre-signed URL."); GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName) .withMethod(HttpMethod.GET).withExpiration(expiration).withSSECustomerKey(SSE_KEY); // generatePresignedUrlRequest.setContentType("video/mp4"); generatePresignedUrlRequest.setSSECustomerKeyAlgorithm(SSEAlgorithm.AES256); URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest); System.out.println("Pre-Signed URL: " + url.toURI() + " With key: " + SSE_KEY); System.out.println("------------------------------"); //https://aws.amazon.com/blogs/developer/generating-amazon-s3-pre-signed-urls-with-sse-c-part-4/ // refer to above doc try { HttpResponse<String> response = Unirest.get(url.toURI().toString()) .header(Headers.SERVER_SIDE_ENCRYPTION_CUSTOMER_ALGORITHM, SSEAlgorithm.AES256.getAlgorithm()) .header(Headers.SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY, Base64.encodeAsString(SECRET_KEY.getEncoded())) .header(Headers.SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5, Md5Utils.md5AsBase64(SECRET_KEY.getEncoded())) .header("cache-control", "no-cache").header("postman-token", "d3453c38-1b59-a12e-fd97-dbe2150eadf5") .asString(); System.out.println(response.getStatus()); System.out.println(response.getStatusText()); System.out.println(response.getBody()); } catch (UnirestException e) { e.printStackTrace(); } }
Спасибо @pavan
Любой клиент, которому нужно использовать SSE-C, должен иметь возможность отправки заголовков ниже.
При использовании предварительно назначенного URL-адреса для извлечения существующего объекта или извлечения только метаданных объекта нам необходимо предоставить все заголовки шифрования в ваше клиентское приложение.
Для шифрования на стороне сервера, управляемого S3 или KMS, мы можем создать предварительно заданный URL-адрес и напрямую вставить его в браузер или проигрыватель.
Однако это не относится к объектам SSE-C, поскольку в дополнение к предварительно назначенному URL-адресу также необходимо включить заголовки HTTP, специфичные для объектов SSE-C. Следовательно, вы можете использовать предварительно назначенный URL-адрес для объектов SSE-C только программно.
Загрузка:
Я выбрал управляемые ключи S3 вместо предоставленного клиентом клиентского ключа.
FileInputStream fin = new FileInputStream(uploadFileName);
byte fileContent[] = new byte[(int) uploadFileName.length()];
// Reads up to certain bytes of data from this input stream into an array of
// bytes.
fin.read(fileContent);
// create string from byte array
// Specify server-side encryption.
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(fileContent.length);
objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName,
new ByteArrayInputStream(fileContent), objectMetadata);
// Upload the object and check its encryption status.
PutObjectResult putResult = s3Client.putObject(putRequest);
System.out.println("Object \"" + keyName + "\" uploaded with SSE.");
GET Предназначенный URL:
java.util.Date expiration = new java.util.Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 60;
expiration.setTime(expTimeMillis);
System.out.println("Generating pre-signed URL.");
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName)
.withMethod(HttpMethod.GET).withExpiration(expiration);
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println("Pre-Signed URL: " + url.toURI());
Ссылка: https://docs.aws.amazon.com/AmazonS3/latest/dev /ServerSideEncryptionCustomerKeys.html