Нужно ли вручную удалять заполнение = из строки в кодировке Base64Url в Dart? - PullRequest
0 голосов
/ 18 мая 2019

Я с удивлением заметил, что когда я конвертировал строку в Base64Url в Dart, я получил строку, заканчивающуюся символом заполнения =.

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

1 Ответ

1 голос
/ 18 мая 2019

spec для base64url (URL и имя файла безопасны) заменяет только 62-й (+) и 63-й (/) символы обычного 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-адресе и сохраняет всю строку, поэтому ее не нужно нормализуется позже.

...