0

我惊讶地发现,当我在 Dart 中将字符串转换为 Base64Url 时,我得到了一个以=填充字符结尾的字符串。

import 'dart:convert';

main() {
  String credentials = "username:password";
  String encoded = base64Url.encode(utf8.encode(credentials)); 

  print(encoded);  // dXNlcm5hbWU6cGFzc3dvcmQ=
}

我认为 Base64Url 的目的是删除 URL 中不好的字符。显然不是。文档甚至列出了它。那么这是否意味着我必须自己手动删除它?

final noPadding = encoded.replaceAll(RegExp('='), ''); // dXNlcm5hbWU6cGFzc3dvcmQ
4

1 回答 1

2

(URL and filename safe)的规范仅分别用和替换普通的第 62 个 ( ) 和第 63 个 ( ) 字符。它不会替换填充字符 ( ),而是做出以下声明:base64url+/base64-_=

填充字符“=”在 URI 中使用时通常采用百分比编码,但如果隐式知道数据长度,则可以通过跳过填充来避免这种情况。

虽然可以删除填充,但您必须小心,因为它不会自动处理,如果您不确保首先使用类似normalize().

我建议只使用Uri类中可用的百分比编码,因为 Dart base64 实现已经自动支持百分比编码的字符串:

import 'dart:convert';

main() {
  String input = 'username:password';
  String encoded = Uri.encodeComponent(base64Url.encode(utf8.encode(input)));
  print(encoded); // dXNlcm5hbWU6cGFzc3dvcmQ%3D
  String decoded = utf8.decode(base64Url.decode(encoded));
  print(decoded); // username:password
}

此外,如果您将base64url编码字符串作为 URL 的一部分传递,那么无论如何使用百分比编码都是有意义的,因为这是 URL 中的预期行为并保留整个字符串,因此以后不必对其进行规范化。

于 2019-05-18T20:46:17.327 回答