Код для декодирования / кодирования модифицированного URL base64
Я хочу, чтобы base64 кодировал данные, чтобы поместить их в URL-адрес, а затем декодировать его в моем HttpHandler.
Я нашел это Кодировка Base64 позволяет использовать символ'/', который испортит мое соответствие UriTemplate. Затем я обнаружил, что существует концепция "модифицированного Base64 для URL" из Википедии:
существует модифицированный вариант Base64 для URL, где не будет использоваться заполнение'=', а символы ' + ' и ' / ' стандартного Base64 соответственно заменяются на '- 'и'_', так что использование кодеров/декодеров URL больше не требуется и не влияет на длину кодированного значения, оставляя ту же самую кодированную форму неповрежденной для использования в реляционных базах данных, веб-формах и идентификаторах объектов в целом.
С помощью .NET я хочу изменить свой текущий код от выполнения базового кодирования и декодирования base64 до использования метода "modified base64 for 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 для Base64 для записи URL StackOverflow, но это имеет известную длину, и поэтому они могут жестко закодировать количество равных знаков, необходимых в конце.
5 ответов:
Это должно заполнить его правильно: -
base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');
также проверить класс HttpServerUtility С помощью методов UrlTokenEncode и UrlTokenDecode, которые обрабатывают безопасное кодирование и декодирование url Base64.
Примечание 1: результат не является допустимой строкой Base64. Некоторые небезопасных символов для URL-адресов будут заменены.
примечание 2: результат отличается от алгоритма base64url в RFC4648.
///<summary> /// Base 64 Encoding with URL and Filename Safe Alphabet using UTF-8 character set. ///</summary> ///<param name="str">The origianl string</param> ///<returns>The Base64 encoded string</returns> public static string Base64ForUrlEncode(string str) { byte[] encbuff = Encoding.UTF8.GetBytes(str); return HttpServerUtility.UrlTokenEncode(encbuff); } ///<summary> /// Decode Base64 encoded string with URL and Filename Safe Alphabet using UTF-8. ///</summary> ///<param name="str">Base64 code</param> ///<returns>The decoded string.</returns> public static string Base64ForUrlDecode(string str) { byte[] decbuff = HttpServerUtility.UrlTokenDecode(str); return Encoding.UTF8.GetString(decbuff); }
недостаточно точек для комментариев, но в случае, если это поможет, фрагмент кода, который сушил нашел в предоставленной ссылке (JSON Web Signature IETF draft), работает при кодировании базы 64 в качестве параметра в URL.
скопировать фрагмент ниже для тех, кто ленив:
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, как описано в вопросе.
найден фрагмент кода c# в этом документе. JSON Web Signature IETF draft
по сравнению с принятым ответом, вот как бы вы принципиально расшифруйте url в кодировке base64, используя C#:
расшифрую:
string codedValue = "base64encodedUrlHere"; string decoded; byte[] buffer = Convert.FromBase64String(codedValue); decoded = Encoding.UTF8.GetString(buffer);
Comments