AWS签名版本4 S3使用Node.js上传

AWS签名版本4 S3使用Node.js上传,node.js,amazon-web-services,amazon-s3,hmac,Node.js,Amazon Web Services,Amazon S3,Hmac,我一直在遵循AWS示例,了解如何生成V4 HMAC签名。我已经在Java中成功地做到了这一点,但我正试图让它在Node/JavaScript中工作。当我使用我的代码时,我在下面的第一个示例中生成了所有正确的中间密钥,但在下一个示例中,当给定测试字符串时,生成正确中间密钥的代码无法生成假定的正确签名 正确的中间密钥: secretkey = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' dateStamp = '20120215' regionName =

我一直在遵循AWS示例,了解如何生成V4 HMAC签名。我已经在Java中成功地做到了这一点,但我正试图让它在Node/JavaScript中工作。当我使用我的代码时,我在下面的第一个示例中生成了所有正确的中间密钥,但在下一个示例中,当给定测试字符串时,生成正确中间密钥的代码无法生成假定的正确签名

正确的中间密钥:

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

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

以下输入失败

secretkey = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
dateStamp = '20151229'
regionName = 'us-east-1'
serviceName = 's3'
StringToSign 在这一方面,他们将在未来的一个10年内,在未来的一个10年内,在未来的一个10年内,在未来的一个10年内,在未来的一个10年内,他们将在未来的一个10年内,在一个10年内,一个10年内,一个10年内,一个10年内,在一个10年内,一个10年内,一个10年内,一个10年内,在一个10年内,一个10年内,在一个10年内,一个10年内,在一个10年内,一个10年内,在一个10年内,在一个10年内,在一个2个2个10年内,在一个2个10-2-2-2-2-2-2-2-2-2-2个世界世界世界世界世界上,在一个世界世界世界世界世界上,在一个世界世界上,在一个世界上,在一个世界上,一国家导弹防御系统WXFDXBSB2FKLMH0BWWfSwncAgiCBBinnYXJ0cY13AxRoiWgIirdB250ZW50LvR5cGuilCAIw2UvTil2UvTil2RhLv1AwQiOiAiAiZZZZZZZZZZZZZZZZZYDhMd2Lv0Hg2Lv0cZYDhTd2Lv0CyZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZYZKVDXMTZWFZDC0XL3MZL2F3CZRFCxDWVZDCJ9LA0KICAGIHsiEC1HBxOTYWxNb3JPDGHTIJIGIKFxUzQTSE1BQ1Tsey1Tsey1Tsey1Tsey1Tsey1Tsey1Tsey1Tsey1Ty1If16LWrhdGuiAiAijamNtymDumDawQp9

正确的签名:46503978D3596DE22955B4B18D6DFB1D54E8C5958727D5BDCDD02CC1119C60FC9 我的签名:E7318F0BFD7D86FB9BA81C314F62192EE2BAF727792EF01FFEFEB430FC2FB68

我的代码

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)
}

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


需要考虑的是,加密JS节点库输出已经在十六进制中的签名。如果您使用Java提供的示例代码学习Java,则无需自己进行手动转换。

我假设您希望自己编写签名代码,但只想指出,当然还有其他选项,包括NPM aws4模块以及AWS JavaScript SDK。@jarmod,但是当我把头发拔出来的时候,我放弃了,并尝试了两个专门用于s3上传的节点模块。我两个都用不上。老实说,考虑到你可以在3个函数中实现这一点,我不知道为什么现有的Npm模块如此冗长。@UsmanMutawakil,我正在寻找这种解决方案。您能否共享生成签名和授权标题所遵循的教程/步骤的链接。谢谢你advance@sravanthi在我问题的第一个环节中,有一些示例说明了如何构建所需的功能。如果您查看该目录中的父链接,将解释您尝试执行的更高级别的概念。如果有帮助,请告诉我。