Код для декодирования / кодирования измененного URL-адреса base64

Я хочу, чтобы base64 закодировал данные, чтобы поместить их в URL-адрес, а затем декодировать его в моем HttpHandler.

Я обнаружил, что Base64 Encoding позволяет использовать символ «/», который испортит совпадение UriTemplate. Затем я обнаружил, что существует концепция «модифицированного Base64 для URL» из википедии:

Существует модифицированный вариант Base64 для URL, в котором не будет использоваться padding ‘=’, а символы «+» и «/» стандартного 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('/', '_'); 

Я видел ссылку на Base64 для записи URL StackOverflow, но имеет известную длину, и поэтому они могут жестко указывать количество равных знаков, необходимых в конце.

Это должно быть правильно написано:

  base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '='); 

Также проверьте class HttpServerUtility с методами UrlTokenEncode и UrlTokenDecode, которые обрабатывают безопасную кодировку и декодирование Base64.

Примечание 1: Результат не является допустимой строкой Base64. Некоторые небезопасные символы для URL-адреса заменяются.

Примечание 2: Результат отличается от алгоритма base64url в RFC4648.

 /// /// Base 64 Encoding with URL and Filename Safe Alphabet using UTF-8 character set. /// ///The origianl string ///The Base64 encoded string public static string Base64ForUrlEncode(string str) { byte[] encbuff = Encoding.UTF8.GetBytes(str); return HttpServerUtility.UrlTokenEncode(encbuff); } /// /// Decode Base64 encoded string with URL and Filename Safe Alphabet using UTF-8. /// ///Base64 code ///The decoded string. public static string Base64ForUrlDecode(string str) { byte[] decbuff = HttpServerUtility.UrlTokenDecode(str); return Encoding.UTF8.GetString(decbuff); } 

Недостаточно точек для комментариев, но в случае, если это помогает, fragment кода, который Sushil нашел в предоставленной ссылке (JSON Web Signature ietf draft), работает при кодировании Base 64 в качестве параметра в URL-адресе.

Скопированный fragment ниже для тех, кто ленив:

  static string Base64UrlEncode(byte[] arg) { string s = Convert.ToBase64String(arg); // Regular base64 encoder s = s.Split('=')[0]; // Remove any trailing '='s s = s.Replace('+', '-'); // 62nd char of encoding s = s.Replace('/', '_'); // 63rd char of encoding return s; } static byte[] Base64UrlDecode(string arg) { string s = arg; s = s.Replace('-', '+'); // 62nd char of encoding s = s.Replace('_', '/'); // 63rd char of encoding switch (s.Length % 4) // Pad with trailing '='s { case 0: break; // No pad chars in this case case 2: s += "=="; break; // Two pad chars case 3: s += "="; break; // One pad char default: throw new System.Exception( "Illegal base64url string!"); } return Convert.FromBase64String(s); // Standard base64 decoder } 

Я попал сюда, ища код для кодирования / декодирования для кодировки base64url, который немного отличается от base64, как объясняется в вопросе.

Найден fragment кода c # в этом документе. Подпись JSON Web Signature ietf

По сравнению с принятым ответом, вот как вы могли бы фундаментально декодировать кодированный base64 url, используя C #:

Decode:

 string codedValue = "base64encodedUrlHere"; string decoded; byte[] buffer = Convert.FromBase64String(codedValue); decoded = Encoding.UTF8.GetString(buffer); 
Давайте будем гением компьютера.