对于我的 web 应用程序,我想直接从客户端与 DynamoDB 通信,无需中间 API Gateway 和 Lambda。而且我不想仅将 JS SDK 用于一些 http 调用和密钥签名。我偶然发现了密钥签名-为几种语言提供的示例,但不适用于本机 js 模块Crypto。使用示例crypto-js
:
Crypto.HmacSHA256(regionName, kDate);
我试过了:
const kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559',
dateStamp = '20120215'
function _binaryToHex(array) {
return array.map(b => ('00' + b.toString(16)).slice(-2)).join('');
}
/**
* https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
*/
async function _importKey(keyDataArrayBuffer) {
return crypto.subtle.importKey(
'raw',
keyDataArrayBuffer,
{'name': 'hmac', 'hash': {'name': 'SHA-256'}},
false,
['sign']);
}
const kDate = _binaryToHex(
Array.from(
new Uint8Array(
await crypto.subtle.sign(
'HMAC',
await _importKey(
new TextEncoder().encode(kSecret)
),
new TextEncoder().encode(dateStamp)
)
)
)
);
console.log(kDate);
/* Must be
* '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
*/
但输出与示例中的不同。