c# - Código para decodificar/codificar una URL base64 modificada
encode decode (5)
Consulte también la clase HttpServerUtility con los métodos UrlTokenEncode y UrlTokenDecode que manejan la codificación y descodificación de Base64 con URL segura.
Nota 1: El resultado no es una cadena Base64 válida. Algunos caracteres inseguros para URL son reemplazados.
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);
}
Quiero base64 codificar datos para ponerlos en una URL y luego decodificarlos dentro de mi HttpHandler.
He descubierto que Base64 Encoding permite un carácter ''/'' que estropeará mi coincidencia UriTemplate. Luego descubrí que hay un concepto de "Base64 modificado para URL" de la wikipedia:
Existe Base64 modificado para la variante de URL, donde no se usará relleno ''='', y los caracteres ''+'' y ''/'' de Base64 estándar se reemplazan respectivamente por ''-'' y ''_'', de modo que se usan codificadores / decodificadores de URL ya no es necesario y no tiene 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 objeto en general.
Uso de .NET Deseo modificar mi código actual desde la codificación y decodificación básica de base64 hasta 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 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 a Base64 para la entrada URL StackOverflow, pero que tiene una longitud conocida y, por lo tanto, pueden codificar el número de signos iguales necesarios al final.
En comparación con la respuesta aceptada, aquí está cómo decodificaría fundamentalmente una url codificada en base64, usando C #:
Descodificar:
string codedValue = "base64encodedUrlHere";
string decoded;
byte[] buffer = Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
Esto debería rellenarlo correctamente:
base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, ''='');
No hay suficientes puntos para comentar, pero en caso de que ayude, el fragmento de código que Sushil encontró en el enlace proporcionado (JSON Web Signature ietf draft) funciona para cuando se codifica Base 64 como un parámetro en URL.
Copiar fragmento a continuación para aquellos que son flojos:
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
}
Pulso aquí mientras busco un código para codificar / decodificar para la codificación base64url, que es un poco diferente de base64, como se explica en la pregunta.
Fragmento de código c # encontrado en este documento. Borrador de ietf de JSON Web Signature