Я хочу кодировать данные base64, чтобы поместить их в URL-адрес, а затем декодировать их в моем HttpHandler.
Я обнаружил, что кодировка Base64 позволяет использовать символ '/', который испортит мое сопоставление UriTemplate. Затем я обнаружил, что есть концепция «модифицированного Base64 для URL» из Википедии:
Существует модифицированный вариант Base64 для URL-адреса, в котором не будет использоваться заполнение '=', а символы '+' и '/' стандартного Base64 заменены соответственно на '-' и '_', чтобы использовать кодировщики / декодеры URL больше не требуется и не влияет на длину закодированного значения, оставляя ту же закодированную форму нетронутой для использования в реляционных базах данных, веб-формах и идентификаторах объектов в целом.
Используя .NET, я хочу изменить свой текущий код, заменив базовое кодирование и декодирование base64 на использование метода «измененный base64 для URL». Кто-нибудь это делал?
Я знаю, что декодирование начинается с чего-то вроде:
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// Append '=' char(s) if necessary - how best to do this?
// My normal base64 decoding now uses encodedText
Но мне потенциально нужно добавить один или два символа '=' в конец, что выглядит немного сложнее.
Моя логика кодирования должна быть немного проще:
// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);
// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');
Я видел Guid to Base64 для записи URL StackOverflow, но она имеет известную длину, и поэтому они могут жестко закодировать количество знаков равенства, необходимых в конце.
Ответы:
Это должно правильно заполнить его: -
источник
Также проверьте класс HttpServerUtility с методами UrlTokenEncode и UrlTokenDecode, которые обрабатывают безопасное для URL-адресов кодирование и декодирование Base64.
Примечание 1. Результат не является допустимой строкой Base64. Некоторые небезопасные символы URL заменены.
Примечание 2: результат отличается от алгоритма base64url в RFC4648.
источник
UrlTokenEncode
это не совсем base64url , поскольку он заменяет заполнение '=' на '0', '1' или '2' в зависимости от того, сколько знаков равенства он заменил.Недостаточно точек для комментариев, но в случае, если это помогает, фрагмент кода, который Сушил нашел в предоставленной ссылке (проект ietf веб-подписи JSON), работает при кодировании Base 64 в качестве параметра в URL-адресе.
Скопированный фрагмент ниже для ленивых:
источник
Я попал сюда, ища код для кодирования / декодирования для кодировки base64url, которая мало отличается от base64, как описано в вопросе.
В этом документе обнаружен фрагмент кода C #. Проект ietf веб-подписи JSON
источник
По сравнению с принятым ответом, вот как вы бы в основном декодировали URL-адрес в кодировке base64, используя C #:
Расшифровать:
источник