Dart 和节点中的签名不同

different in signature in Dart & node

我正在尝试为 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,从数字中得到十个,所以需要更多的 ascii 字符来组成 64 - 加上特殊的尾随等号。)

/+ 字符在 URL 中具有特殊含义,因此可以用 _-。另请注意,可以删除尾随的等号。

您似乎在尝试比较 base64 编码的字符串以测试是否相等。从 base 64 解码并比较字节数组更安全。

无论如何,为了解决你的问题,不要使用 Dart URL 安全版本,使用普通版本:base64.encode()