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()
我正在尝试为 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()