Dart & node 中的签名不同

  • 本文关键字:node Dart flutter dart
  • 更新时间 :
  • 英文 :


我试图为一个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()

最新更新