Pergunta

Quero basear os dados base64 para colocá -los em um URL e, em seguida, decodificá -los dentro do meu httphandler.

Eu encontrei isso Codificação base64 Permite um caractere '/' que atrapalhará minha correspondência de uritemplate. Então eu descobri que existe um conceito de "Base64 modificada para URL" da Wikipedia:

Existe uma variante Base64 modificada para URL, onde nenhum preenchimento '=' será usado, e os caracteres '+' e '/' de Base64 padrão são substituídos respectivamente por '-' e '_', de modo que usando codificadores/decodificadores de URL não é mais necessário e não tem impacto no comprimento do valor codificado, deixando o mesmo formulário codificado intacto para uso em bancos de dados relacionais, formulários da Web e identificadores de objetos em geral.

Usando .NET, quero modificar meu código atual da codificação e decodificação básica base64 para usar o método "Base64 modificado para URL". Alguém já fez isso?

Para decodificar, eu sei que começa com algo como:

string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');

// Append '=' char(s) if necessary - how best to do this?

// My normal base64 decoding now uses encodedText

Mas preciso adicionar potencialmente um ou dois chars '=' ao final que parecem um pouco mais complexos.

Minha lógica de codificação deve ser um pouco mais simples:

// 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('/', '_');

Eu vi o Guid para base64 para URL Entrada do StackOverflow, mas isso tem um comprimento conhecido e, portanto, eles podem codificar o número de sinais iguais necessários no final.

Foi útil?

Solução

Isso deve prendê-lo corretamente:-

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

Outras dicas

Verifique também a classe HttpServerutility com os métodos UrlTokenEncode e UrlTokEndecode que estão lidando com a codificação e decodificação Base64 da URL SAFE64.

Nota 1: O resultado não é uma string base64 válida. Alguns caracteres inseguros para URL são substituídos.

Nota 2: O resultado difere do algoritmo BASE64URL no 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);
}

Não há pontos suficientes para comentar, mas, caso isso ajude, o snippet de código que Sushil encontrou no link fornecido (JSON Web Signature IETF Draft) funciona ao codificar a base 64 como um parâmetro na URL.

Snippet copiado abaixo para aqueles que são preguiçosos:

    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
    }

Eu bati aqui enquanto procuro código para fazer codificar/decodificar para a codificação BASE64URL, que é pouco diferente do Base64, conforme explicado na pergunta.

Encontrou snippet de código C# neste documento. JSON Web Signature Ietf Draft

Em comparação com a resposta aceita, eis como você faria fundamentalmente decodificar Um URL codificado base64, usando C#:

Decodificar:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top