Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使window.crypto.sential输出与';相同的签名;加密';js库?_Javascript_Encryption_Browser_Cryptography_Signature - Fatal编程技术网

Javascript 如何使window.crypto.sential输出与';相同的签名;加密';js库?

Javascript 如何使window.crypto.sential输出与';相同的签名;加密';js库?,javascript,encryption,browser,cryptography,signature,Javascript,Encryption,Browser,Cryptography,Signature,我想使用内置的浏览器加密对象,而不是在我的浏览器项目中导入加密库 我不想用这个 npm i加密 下面的代码演示了如何使用这两个库对简单消息进行签名,但是使用内置的crypto对象时会得到不同的结果。输出被记录到控制台 // START CRYPTO LIBRARY METHOD import crypto from 'crypto'; const HMAC_SHA256_KEY = { API_KEY: '***', SECRET_KEY: '***' }; const qu

我想使用内置的浏览器加密对象,而不是在我的浏览器项目中导入加密库

我不想用这个

npm i加密

下面的代码演示了如何使用这两个库对简单消息进行签名,但是使用内置的crypto对象时会得到不同的结果。输出被记录到控制台

// START CRYPTO LIBRARY METHOD
import crypto from 'crypto';

const HMAC_SHA256_KEY = {
    API_KEY: '***',
    SECRET_KEY: '***'
};

const queryString = `timestamp=${(new Date().getTime())}`;

const signature = crypto
    .createHmac('sha256', HMAC_SHA256_KEY.SECRET_KEY)
    .update(queryString)
    .digest('hex')

console.log("standard encrypt", signature);

// START NATIVE LIBRARY METHOD    
const getUtf8Bytes = (str: string) => {
    return new Uint8Array(
        [...(unescape(encodeURIComponent(str)))].map(c => c.charCodeAt(0))
    );
};

// @ts-ignore
const builtInCrypto = window.crypto || window.msCrypto;
builtInCrypto.subtle.importKey(
    'raw',
    getUtf8Bytes(HMAC_SHA256_KEY.SECRET_KEY),
    {
        name: 'HMAC', hash: 'SHA-256'
    },
    true, ['sign']
).then(key => {
    builtInCrypto.subtle.sign(
        'HMAC',
        key,
        getUtf8Bytes(queryString))
        .then(signature => {
            console.log('builtIn Signature', btoa(String.fromCharCode(...(new Uint8Array(signature)))));
        })
})
很明显我做错了什么,但是什么?为什么本机加密会得到不同的输出?

对于相同的
HMAC\u SHA256\u KEY.SECRET\u KEY
queryString
(最后一个参数取决于时间,因此每次运行都有不同的值)两个脚本返回相同的HMAC,但编码不同,导致不同的输出。在NodeJS/crypto代码中,HMac是十六进制编码的,在JavaScript/Web crypto API代码中是Base64编码的

为确保输出相同,两个脚本中必须使用相同的编码。JavaScript/Web Crypto API代码中的HMac也必须是十六进制编码的,例如,有关合适的方法,请参阅,或者NodeJS/Crypto代码中的HMac必须是Base64编码的(通过将
'Base64'
而不是
'hex'
作为
摘要的参数传递)。在NodeJS/crypto代码中,HMac是十六进制编码的,在JavaScript/Web crypto API代码中是Base64编码的

为确保输出相同,两个脚本中必须使用相同的编码。JavaScript/Web Crypto API代码中的HMac也必须是十六进制编码的,例如,有关合适的方法,请参阅,或者NodeJS/Crypto代码中的HMac必须是Base64编码的(通过将
'Base64'
而不是
'hex'
作为
摘要的参数传递)