Quero codificar os dados em base64 para colocá-los em uma URL e, em seguida, decodificá-los no meu HttpHandler.
Eu descobri que a codificação Base64 permite um caractere '/' que bagunçará a correspondência do meu UriTemplate. Então descobri que existe um conceito de "Base64 modificada para URL" da wikipedia:
Existe uma base64 modificada para a variante de URL, onde nenhum preenchimento '=' será usado, e os caracteres '+' e '/' do 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 sobre o comprimento do valor codificado, deixando a mesma forma codificada intacta para uso em bancos de dados relacionais, formulários da web e identificadores de objeto em geral.
Usando o .NET, quero modificar meu código atual de codificação e decodificação básicas em base64 para o método "base64 modificada 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, eu preciso adicionar potencialmente um ou dois caracteres '=' ao final, o que parece um pouco mais complexo.
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 a entrada URL StackOverflow, mas isso tem um comprimento conhecido e, portanto, eles podem codificar o número de sinais de igual necessários no final.
Respostas:
Isso deve preenchê-lo corretamente: -
fonte
Verifique também a classe HttpServerUtility com os métodos UrlTokenEncode e UrlTokenDecode que está lidando com a codificação e decodificação Base64 segura de URL.
Nota 1: o resultado não é uma string Base64 válida. Alguns caracteres não seguros para URL são substituídos.
Nota 2: O resultado difere do algoritmo base64url em RFC4648.
fonte
UrlTokenEncode
não é estritamente base64url , pois substitui o preenchimento '=' por '0', '1' ou '2', dependendo de quantos sinais de igual ele substituiu.Não há pontos suficientes para comentar, mas caso ajude, o snippet de código que Sushil encontrou no link fornecido (JSON Web Signature ietf draft) funciona para ao codificar Base 64 como um parâmetro na URL.
Snippet copiado abaixo para aqueles que são preguiçosos:
fonte
Bati aqui enquanto procuro o código para fazer a codificação / decodificação para a codificação base64url, que é um pouco diferente da base64, conforme explicado na pergunta.
Snippet de código c # encontrado neste documento. Rascunho de ietf de assinatura da Web JSON
fonte
Em comparação com a resposta aceita, aqui está como você decodificaria fundamentalmente um url codificado em base64, usando C #:
Decodificar:
fonte