Проблема безопасности файла изображения при загрузке S3

#amazon-s3

#amazon-s3

Вопрос:

Я читаю следующее руководство:

 https://devcenter.heroku.com/articles/s3-upload-node#uploading-directly-to-s3
  

Первым шагом является выбор пользователем изображения

 function s3_upload(){
    var s3upload = new S3Upload({
        file_dom_selector: '#files',
        s3_sign_put_url: '/sign_s3',
        onProgress: function(percent, message) {
            // some code
        },
        onFinishS3Put: function(public_url) {
            // some cde
        },
        onError: function(status) {
            // somecode
        }
    });
}
  

Теперь s3_sign_put_url ссылается на функцию на стороне сервера, которая возвращает

 app.get('/sign_s3', function(req, res){
...
// calculates signature (signature variable)
// sets expiration time (expires variable)
var credentials = {
    signed_request: url "?AWSAccessKeyId=" AWS_ACCESS_KEY "amp;Expires=" expires "amp;Signature=" signature,
    url: url
 };
...
}
  

Если я уже вычислил подпись как функцию (AWS_SECRET_KEY) следующим образом:

 var signature = crypto.createHmac('sha1', AWS_SECRET_KEY).update(put_request).digest('base64');
signature = encodeURIComponent(signature.trim());
signature = signature.replace('+',' ');
  

Вопрос:
Почему я должен передавать значение AWS_SECRET_KEY как часть объекта credentials, возвращаемого функцией s3_sign? почему подписи недостаточно для возврата? разве это не проблема безопасности?

Ответ №1:

Вы этого не делаете.

Возвращенные учетные данные содержат AWS_ACCESS_KEY, а не AWS_SECRET_KEY.

Ключ доступа аналогичен имени пользователя… это необходимо S3, чтобы он знал, кто создал подпись. Исходя из этого, S3 ищет связанный секретный ключ внутри, создает подпись для запроса, и если это та же подпись, что и сгенерированная вами, и предоставленный ключ доступа связан с пользователем, имеющим разрешение на выполнение операции, она выполняется успешно.

Ключ доступа и секретный ключ работают как пара, и один не может быть разумно получен из другого; ключ доступа не считается закрытым, в то время как секретный ключ является.