【问题标题】:AWS Signature V2: generate a signature for a Query request in JavascriptAWS Signature V2:为 Javascript 中的查询请求生成签名
【发布时间】:2021-07-10 00:13:55
【问题描述】:

我正在尝试在 javascript 上重新创建 AWS 签名版本 2 身份验证,我现在拥有的是

String.prototype.getBytes = () => {
    return this.toString()
        .split('')
        .map((i) => i.charCodeAt(0));
};

let key = 'redacted_access_key_id';

const bytes = key.getBytes();

let signingKey = crypto.HmacSHA256(bytes, key);

let data = JSON.stringify({ lang: 'en', pageNumber: 0, pageSize: 20 });

const contentMd5 = crypto.MD5(data).toString();

data = data.getBytes();

signingKey = crypto.HmacSHA256(data, key);

const result = Buffer.from(signingKey.toString()).toString('base64');

输出类似的东西

ZGY0MmI3MDVjNmJlNzY5ZWYwZjU1ZTc5MDhhOGNkYzI3ZWVjYzQ5ODBmY2M1NGI5NTc2MmVmNTY1NzEwNjhhMA== 

这是不正确的,因为散列的长度应该正好是 28 个字符。现在 AWS 签名版本 2 身份验证文档显示了它是如何制作的,但仅限于 java

import java.security.SignatureException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.amazonaws.util.*;

/**
* This class defines common routines for generating
* authentication signatures for AWS Platform requests.
*/
public class Signature {
    private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
    public static String calculateRFC2104HMAC(String data, String key)
    throws java.security.SignatureException
    {
        String result;
        try {

            // Get an hmac_sha256 key from the raw key bytes.
            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF-8"), HMAC_SHA256_ALGORITHM);

            // Get an hmac_sha256 Mac instance and initialize with the signing key.
            Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
            mac.init(signingKey);

            // Compute the hmac on input data bytes.
            byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8"));

            // Base64-encode the hmac by using the utility in the SDK
            result = BinaryUtils.toBase64(rawHmac);
            

        } catch (Exception e) {
            throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
        }
        return result;
    }
}

我正在尝试在 javascript 中重新创建完全相同的代码,但出现了问题。有人可以帮我解决这个问题吗,我在 javascript 中找不到任何示例。

谢谢。

【问题讨论】:

  • 您可以只使用aws-sign-v2 包(或其内联source code)。
  • 同意@jarmod,不要重新发明轮子并使用其他已经具有签名逻辑的包......我已经完成了尝试自己编写签名逻辑的路径,你会不断在代码中遇到带有边缘情况的错误......只需使用已经过良好测试的库

标签: javascript java amazon-web-services hash


【解决方案1】:

以下代码相当于JS中calculateRFC2104HMAC的Java版。

const CryptoJS = require('crypto-js');

const calculateRFC2104HMAC = (data, key) => {
    const rawHmac = CryptoJS.HmacSHA256(CryptoJS.enc.Utf8.parse(data), CryptoJS.enc.Utf8.parse(key));
    return CryptoJS.enc.Base64.stringify(rawHmac);
}

示例使用基于AWS Signature V2页面上的示例

const urlSafeSignature = (data, key) => encodeURIComponent(calculateRFC2104HMAC(data, key));

const data = 
`GET
elasticmapreduce.amazonaws.com
/
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31`
const key = `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY`
console.log(urlSafeSignature(data, key));

文档建议使用AWS Signature V4,它在 NPM here 上有一个 AWS 发布的库。 AWS 签名请求适用于 AWS 服务,请求中的签名有助于验证请求,防止重放攻击。我不确定您要在以下代码中发送什么内容以及针对哪个 AWS 服务。

let data = JSON.stringify({ lang: 'en', pageNumber: 0, pageSize: 20 });

您必须按照 AWS 文档提供签署请求所需的所有详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2020-01-17
    • 2019-04-26
    相关资源
    最近更新 更多