当前位置: 首页 > 知识库问答 >
问题:

AWS Signature Version 4 S3使用Node.js上传

颜黎昕
2023-03-14

我一直在关注AWS如何生成V4 HMAC签名的示例。我已经在Java成功地做到了这一点,但我正在努力让它在节点/JavaScript中工作。当我使用我的代码时,我在下面的第一个例子中生成了所有正确的中介密钥,但是在下一个例子中,当给定测试StringToSign时,生成正确中介密钥的相同代码无法生成假定的正确签名。

正确的中间密钥:

secretkey = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
dateStamp = '20120215'
regionName = 'us-east-1'
serviceName = 'iam'

kSecret  = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559'
kDate    = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
kRegion  = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'

http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html.

由于以下输入而失败

secretkey = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
dateStamp = '20151229'
regionName = 'us-east-1'
serviceName = 's3'

StringToSign eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXqifSwNCiAgICBbInN0YXJ0cy13aXRoiwgliRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3qiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1

正确签名: 46503978d3596de22955b4b18d6dfb1d54e8c5958727d5bdcd02cc1119c60fc9我的签名: e7318f0bfd7d86fb9ba81c314f62192ee2baf7273792ef01ffafeb430fc2fb68

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

我的代码

var crypto = require("crypto-js")

module.exports.getSignatureKey = function(key, dateStamp, regionName, serviceName) {
    var kSecret = "AWS4" + key
    var kDate = crypto.HmacSHA256(dateStamp, kSecret)
    var kRegion = crypto.HmacSHA256(regionName, kDate)
    var kService = crypto.HmacSHA256(serviceName, kRegion)
    var kSigning = crypto.HmacSHA256("aws4_request", kService)
    return kSigning;
}

module.exports.sign = function(signatureKey,stringToSign) {
    var unencodedSignature = crypto.HmacSHA256(stringToSign,signatureKey)
    return unencodedSignature
}

module.exports.getSignature = function(stringToSign,secretKey,dateStamp,regionName, serviceName) {
    var signingKey = this.getSignatureKey(secretKey,dateStamp,regionName,serviceName)

    return this.sign(signingKey,stringToSign)
}

共有1个答案

萧心水
2023-03-14

第二个链接中的AWS示例具有错误的签名。使用我的解决方案,我能够成功地上传到s3。

需要考虑的另一件事是Crypto-js节点库输出已经在十六进制中的签名。没有必要做一个手动转换自己,如果你Java使用他们提供的示例代码

 类似资料:
  • 问题内容: 我试图用https运行我的节点服务器。我正在使用express和socket.io。 这是我的https代码: 在我的客户上,其以下内容: 现在我在服务器上收到以下异常: uncaughtException:缺少PFX或证书+私钥。 编辑:现在我越来越 错误的请求 您的浏览器发送了该服务器无法理解的请求。原因:您正在对启用SSL的服务器端口使用纯HTTP。请改用HTTPS方案访问此UR

  • 问题内容: 我在Node.js中使用POST请求上传文件时遇到问题。我必须使用模块来完成该操作(无需外部npms)。服务器需要它是包含文件数据字段的多部分请求。看起来很容易,但不使用任何外部模块就很难在Node.js中完成。 我尝试使用此示例,但未成功: 问题答案: 看起来您已经在使用module了。 在这种情况下,您需要发布的只是使用其功能: 但是,如果您想从文件系统中发布一些现有文件,则可以简

  • 问题内容: 我试图了解如何使用Node.js在Firebase Storage中上传文件。我的第一次尝试是使用Firebase库: 但是事实证明,Firebase无法从服务器端上传文件,正如在文档中明确指出的那样: Firebase存储不包含在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户端。 在代码中,您可以使用以下方式访问存储分区: 我们可以在没有Go

  • 问题内容: 我正在尝试使用以下方式开始提供一些静态网页: 因此,我在与文件相同的目录中的目录中添加了一个简单的目录,但是当我尝试在浏览器中查看页面时,我从节点得到了以下响应: 不能获取 / 我在做什么错以及如何纠正? 问题答案: 此代码应工作: 同样在connect 2.0中,不建议使用.createServer()方法。使用connect()代替。

  • 问题内容: 我正在尝试使用将图片上传到亚马逊s3 ,但出现此错误: TypeError:预期opts.s3为对象node_modules / multer-s3 / index.js:69:20 这是我的服务器代码: 为什么我收到此错误? 问题答案: 完成 并正常工作的Node Cheat | 使用multer-s3上传到s3 。 码: 对于完整的回购 : 克隆node-cheat express

  • 我正在尝试使用node.jsaws-sdk将大文件上传到s3存储桶。 方法以分段上传方式完整上传文件。 我想使用新的V3 aws-sdk。在新版本中上传大文件的方法是什么?方法似乎没有这样做。 我见过一些方法,例如,但我似乎找不到使用它们的完整工作示例。 先谢谢你。