Javascript 不带外部库的HMAC-SHA1签名(例如CryptoJS)

Javascript 不带外部库的HMAC-SHA1签名(例如CryptoJS),javascript,twitter,hmac,Javascript,Twitter,Hmac,我需要加密然后对字符串进行base64编码,以使用Twitter的OAuth 1.1 API进行身份验证 我设计的平台提供了HMAC功能,所以第一部分很好。然而,当我尝试对结果进行Base64编码时,它编码的是十六进制表示,而不是HMAC哈希输出的字节码版本 我的工作示例使用CryptoJS,但我需要在没有它的情况下获得相同的结果,但是使用btoa会得到不同的结果 当前工作代码,对HMAC使用CryptoJS,然后使用Base64编码: const encrypted = CryptoJS.Hm

我需要加密然后对字符串进行base64编码,以使用Twitter的OAuth 1.1 API进行身份验证

我设计的平台提供了HMAC功能,所以第一部分很好。然而,当我尝试对结果进行Base64编码时,它编码的是十六进制表示,而不是HMAC哈希输出的字节码版本

我的工作示例使用CryptoJS,但我需要在没有它的情况下获得相同的结果,但是使用
btoa
会得到不同的结果

当前工作代码,对HMAC使用CryptoJS,然后使用Base64编码:

const encrypted = CryptoJS.HmacSHA1("message", "secret");
const encoded = CryptoJS.enc.Base64.stringify(encrypted)
console.log(encrypted);
// encrypted = "0caf649feee4953d87bf903ac1176c45e028df16"
console.log(encoded);
// encoded = DK9kn+7klT2Hv5A6wRdsReAo3xY=
我已经能够通过复制Python(我的首选语言)中的代码进行调试,并且可以看到“加密”版本是一个十六进制字符串,这就是我尝试的“内置”版本无法工作的原因

编辑:为
btoa
添加了代码,这为我需要的内容提供了错误的输出。与上面编码的
的输出进行比较:

console.log(btoa(encrypted));
// btoa_version = "MGNhZjY0OWZlZWU0OTUzZDg3YmY5MDNhYzExNzZjNDVlMDI4ZGYxNg=="

然后,您需要实现您自己的HMAC-SHA1代码。您可以使用
btoa
atob
与base64进行转换。然后,您需要实现您自己的HMAC-SHA1代码。您可以使用
btoa
atob
与base64进行转换。