1

对于我的 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'
 */ 

但输出与示例中的不同。

4

1 回答 1

1

像往常一样,我必须细心周到 - 这里是简单的错误 - 输入键kSecret已经编码为十六进制 - 但必须是原始的人类可读值

new TextEncoder().encode('AWS4wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY')

于 2018-01-13T20:33:36.240 回答