Quiero codificar datos en base64 para ponerlos en una URL y luego decodificarlos dentro de mi HttpHandler.
Descubrí que la codificación Base64 permite un carácter '/' que estropeará mi coincidencia de UriTemplate. Luego descubrí que hay un concepto de "Base64 modificada para URL" de wikipedia:
Existe una variante de Base64 modificada para URL, donde no se usará el relleno '=', y los caracteres '+' y '/' de Base64 estándar se reemplazan respectivamente por '-' y '_', de modo que el uso de codificadores / decodificadores de URL ya no es necesario y no tiene ningún impacto en la longitud del valor codificado, dejando la misma forma codificada intacta para su uso en bases de datos relacionales, formularios web e identificadores de objetos en general.
Usando .NET Quiero modificar mi código actual de hacer la codificación y decodificación básica de base64 a usar el método "base64 modificado para URL". ¿Alguien ha hecho esto?
Para decodificar, sé que comienza con algo como:
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// Append '=' char(s) if necessary - how best to do this?
// My normal base64 decoding now uses encodedText
Pero, necesito agregar potencialmente uno o dos caracteres '=' al final, lo que parece un poco más complejo.
Mi lógica de codificación debería ser un poco más simple:
// 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('/', '_');
He visto el Guid to Base64 para la entrada URL StackOverflow, pero tiene una longitud conocida y, por lo tanto, pueden codificar la cantidad de signos iguales necesarios al final.
Respuestas:
Esto debería rellenarlo correctamente: -
fuente
También verifique la clase HttpServerUtility con los métodos UrlTokenEncode y UrlTokenDecode que manejan la codificación y decodificación Base64 segura para URL.
Nota 1: El resultado no es una cadena Base64 válida. Se reemplazan algunos caracteres no seguros para URL.
Nota 2: El resultado difiere del algoritmo base64url en RFC4648.
fuente
UrlTokenEncode
no es estrictamente base64url , ya que reemplaza el relleno '=' con '0', '1' o '2' dependiendo de cuántos signos iguales reemplazó.No hay suficientes puntos para comentar, pero en caso de que ayude, el fragmento de código que Sushil encontró en el enlace provisto (JSON Web Signature ietf draft) funciona cuando se codifica Base 64 como parámetro en la URL.
Fragmento copiado a continuación para aquellos que son vagos:
fuente
Presioné aquí mientras buscaba código para codificar / decodificar para la codificación base64url, que es un poco diferente a base64 como se explica en la pregunta.
Se encontró un fragmento de código c # en este documento. Borrador de ietf de firma web JSON
fuente
En comparación con la respuesta aceptada, así es como decodificaría fundamentalmente una URL codificada en base64, usando C #:
Descodificar:
fuente