Javascript 如何使window.crypto.sential输出与';相同的签名;加密';js库?
我想使用内置的浏览器加密对象,而不是在我的浏览器项目中导入加密库 我不想用这个 npm i加密 下面的代码演示了如何使用这两个库对简单消息进行签名,但是使用内置的crypto对象时会得到不同的结果。输出被记录到控制台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
// 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'
作为摘要的参数传递)