2014-07-05 91 views
0

我在讀下面的教程: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+"&Expires="+expires+"&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('%2B','+'); 

問題: 爲什麼我必須通過AWS_SECRET_KEY值作爲憑據對象由s3_sign函數返回的一部分嗎?爲什麼不是簽名足以被退回?是不是這是一個安全問題

回答

1

你沒有這樣做。

返回的憑證包含AWS_ACCESS_KEY而不是AWS_SECRET_KEY。

訪問密鑰類似於用戶名...... S3需要它,以便它知道誰創建了簽名。由此,S3在內部查找相關的密鑰,爲請求創建一個簽名,如果它與您生成的簽名相同,並且提供的訪問密鑰與有權執行該操作的用戶相關聯,則它會成功。

訪問密鑰和密鑰作爲一對工作,並且不能合理地從另一個派生;訪問密鑰不被認爲是私密的,而祕密密鑰是。