Pregunta

Quiero codificar los datos en base64 para ponerlos en una URL y luego decodificarlos en mi HttpHandler.

He descubierto que Base64 Encoding permite un carácter '/' que estropeará mi UriTemplate a juego. Luego descubrí que hay un concepto de una Base64 modificada para URL. de wikipedia:

Existe una base64 modificada para la variante de URL, donde no se utilizará el relleno '=', y los caracteres '+' y '/' de Base64 estándar se reemplazan respectivamente por '-' y '_', de modo que el uso de URL los codificadores / decodificadores ya no son necesarios y no tienen impacto en la longitud del valor codificado, dejando el mismo formulario codificado intacto para su uso en bases de datos relacionales, formularios web e identificadores de objetos en general.

Uso de .NET Deseo modificar mi código actual desde la codificación y decodificación básica base64 al uso de la base64 modificada para URL. método. ¿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 la Guid a Base64 para URL entrada StackOverflow, pero eso tiene una longitud conocida y, por lo tanto, pueden codificar el número de signos iguales necesarios al final.

¿Fue útil?

Solución

Esto debería rellenarlo correctamente: -

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

Otros consejos

Compruebe también la clase HttpServerUtility con los métodos UrlTokenEncode y UrlTokenDecode que maneja la codificación y decodificación Base64 segura de URL.

Nota 1: El resultado no es una cadena Base64 válida. Se reemplazan algunos caracteres inseguros para URL.

Nota 2: El resultado difiere del algoritmo base64url en 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);
}

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 URL.

Fragmento copiado a continuación para aquellos que son perezosos:

    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
    }

Golpeé aquí mientras buscaba código para codificar / decodificar para la codificación base64url, que es un poco diferente a la base64 como se explica en la pregunta.

Fragmento de código C # encontrado en este documento. JSON Web Signature ietf draft

En comparación con la respuesta aceptada, así es cómo fundamentalmente decodificará una url codificada en base64, usando C #:

Decode:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top