繁体   English   中英

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

[英]Do I need to manually remove the = padding from a Base64Url encoded string in Dart?

我很惊讶地注意到,当我在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

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

填充字符“ =”在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的一部分进行传递,则base64url使用百分比编码,因为这是URL中的预期行为,并且保留了整个字符串,因此以后不必进行标准化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM