我是否需要在Dart中从Base64Url编码的字符串中手动删除=填充?

时间:2019-05-18 18:42:02

标签: dart base64url

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

import 'dart:convert';

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

  print(encoded);  // dXNlcm5hbWU6cGFzc3dvcmQ=
}

我认为Base64Url的重点是删除URL中不好的字符。显然不是。 docs甚至将其列出。那是否意味着我必须自己手动将其删除?

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

1 个答案:

答案 0 :(得分:1)

base64url的{​​{3}}(URL和文件名安全)仅将普通+的第62个(/)和第63个(base64)字符替换为-_。它不会替换填充字符(=),而是发出以下语句:

  

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

虽然可以删除填充,但您必须要小心,因为它不会自动处理,如果您不确定首先使用{{3 }}。

相反,我建议只使用spec类中可用的百分比编码,因为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中的预期行为,并且保留了整个字符串,因此它没有待稍后标准化。

相关问题