我正在阅读以下教程:
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函数返回的凭据对象的一部分传递?为什么签名不足以归还?这不是安全问题?
答案 0 :(得分:1)
你不是那样做的。
返回的凭据包含AWS_ACCESS_KEY,而不是AWS_SECRET_KEY。
访问密钥类似于用户名... S3需要它,以便它知道谁创建了签名。由此,S3在内部查找关联的密钥,为请求创建签名,如果它与您生成的签名相同,并且提供的访问密钥与具有执行操作权限的用户相关联,则成功。
访问密钥和密钥作为一对工作,并且不能合理地从另一个中导出;访问密钥不被视为私有密钥,而密钥是。