Я хочу добиться безопасного кодирования URL-адресов Base64 на C #. В Java у нас есть общая Codec
библиотека, которая дает мне строку с безопасным кодированием URL. Как я могу добиться того же с помощью C #?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Приведенный выше код преобразует его в Base64, но он дополняет ==
. Есть ли способ добиться безопасного кодирования URL?
Url.Encode
струнуBASE64
?System.Web
сборку.url safe
?%3D
безопасен по URL.Ответы:
Обычно просто заменяют алфавит местами для использования в URL-адресах, поэтому нет необходимости в% -кодировании; только 3 из 65 символов являются проблемными -
+
,/
и=
. наиболее распространенные замены --
на место+
и_
вместо/
. Что касается прокладки: просто удалите ее (the=
); вы можете сделать вывод о количестве необходимых отступов. С другой стороны: просто переверните процесс:с участием:
и отменить:
Однако возникает интересный вопрос: является ли это тем же подходом, что и «общая библиотека кодеков»? Конечно, было бы разумно в первую очередь протестировать - это довольно распространенный подход.
источник
==
заполнением, 2x8 кодируется как 3x6 с=
заполнением, 3x8 кодируется как 4x6 без заполнения, а затем выравнивается, поэтому он повторяется. Ничего не кодируется в бит 1x6, поэтому===
заполнение не требуется .Вы можете использовать класс
Base64UrlEncoder
из пространства именMicrosoft.IdentityModel.Tokens
.источник
Другой вариант, если вы используете ASP.NET Core, - использовать
Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.Если вы не используете ASP.NET Сердечник, источник доступен по лицензии Apache 2.0 .
WebEncoders
источник
Основываясь на приведенных здесь ответах с некоторыми улучшениями производительности, мы опубликовали очень простую в использовании URL-безопасную реализацию base64 для NuGet с исходным кодом, доступным на GitHub (с лицензией MIT).
Использование так же просто, как
источник
"string".Replace
дляencode
метода, но петли с ручным Заменяет дляdecode
?Чтобы получить безопасную для URL кодировку, подобную base64, но не «base64url» согласно RFC4648, используйте
System.Web.HttpServerUtility.UrlTokenEncode(bytes)
для кодирования иSystem.Web.HttpServerUtility.UrlTokenDecode(bytes)
декодирования.источник
Самое простое решение: (без заполнения)
Кредит принадлежит: Толле
источник
Вот еще один метод декодирования URL-адреса base64, который был закодирован таким же образом с Marc. Я просто не понимаю, почему
4-length%4
сработало (да).Таким образом, только длина исходного кода в битах является общим кратным 6 и 8, base64 не добавляет "=" к результату.
Таким образом, мы можем сделать это наоборот, если длина результата не может делиться на 8, он был добавлен:
источник
Использование криптографического ядра Microsoft в UWP.
источник
Ответ Каранвира Канга хороший, и я проголосовал за него. Однако в конце строки остается нечетный символ (указывающий на количество удаленных символов заполнения). Вот мое решение.
источник