我试图为一个HTTP请求签名,在NodeJs中为应用程序和服务器使用flutter/dart但是我有一个问题,两个签名有一点不同知道是什么原因吗
EEFSxb_coHvGM-69RhmfAlXJ9J0= //signature in dart
EEFSxb/coHvGM+69RhmfAlXJ9J0= //signature in nodejs
signature.dart
var key = "key";
var data = "data";
List<int> signingKey = utf8.encode("key");
List<int> signatureBaseString = utf8.encode("data");
var hmacSha1 = Hmac(sha1, signingKey);
var digest = hmacSha1.convert(signatureBaseString);
var hashInBase = base64Url.encode(digest.bytes);
print(hashInBase) ; // result : EEFSxb_coHvGM-69RhmfAlXJ9J0=
signature.js
var data = "data" ;
var key = "key" ;
var output = encodeURIComponent(data);
var keyO = encodeURIComponent(key);
var hashed = CryptoJS.HmacSHA1(output , keyO);
var hashInBase = CryptoJS.enc.Base64.stringify(hashed);
console.log(hashInBase); // result : EEFSxb/coHvGM+69RhmfAlXJ9J0=
Base64编码有两种样式,它们对64个字符使用略微不同的字符集。(你从大写字母和小写字母中得到52,从数字中得到10,所以需要更多的ascii字符来组成64 -加上特殊的尾随等号。)
/
和+
字符在URL中有特殊的含义,因此可以用"URL安全"替代。用_
和-
编码。还要注意,后面的等号可以去掉。
似乎你可能试图比较base64编码的字符串来测试是否相等。从64进制解码并比较字节数组更安全。
无论如何,为了解决您的问题,不要使用Dart URL安全版本,使用常规版本:base64.encode()