【发布时间】: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