Desejo alcançar a codificação segura de URL Base64 em C #. Em Java, temos a Codec
biblioteca comum que me fornece uma string codificada de URL segura. Como posso conseguir o mesmo usando C #?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
O código acima o converte em Base64, mas ele preenche ==
. Existe uma maneira de obter uma codificação segura de URL?
Url.Encode
na cordaBASE64
?System.Web
assembly.url safe
?%3D
é url seguro.Respostas:
É comum simplesmente trocar o alfabeto para uso em urls, de forma que nenhuma codificação% seja necessária; apenas 3 dos 65 caracteres são problemáticos -
+
,/
e=
. as substituições mais comuns estão-
no lugar de+
e_
no lugar de/
. Quanto ao preenchimento: basta retirá-lo (o=
); você pode inferir a quantidade de preenchimento necessária. Na outra ponta: basta inverter o processo:com:
e para reverter:
A questão interessante, entretanto, é: esta é a mesma abordagem que a "biblioteca de codecs comuns" usa? Certamente seria uma primeira coisa razoável a testar - esta é uma abordagem bastante comum.
fonte
==
preenchimento, 2x8 é codificado como 3x6 com=
preenchimento, 3x8 é codificado como 4x6 sem preenchimento e, em seguida, é alinhado para que se repita. Nada é codificado em 1x6 bits, então você nunca precisa de===
preenchimento.Você pode usar a classe
Base64UrlEncoder
do namespaceMicrosoft.IdentityModel.Tokens
.fonte
Outra opção, se você estiver usando ASP.NET Core, seria usar
Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.Se você não estiver usando o ASP.NET Core, a
WebEncoders
fonte está disponível sob a licença Apache 2.0 .fonte
Com base nas respostas aqui com algumas melhorias de desempenho, publicamos uma implementação base64 segura para url muito fácil de usar no NuGet com o código-fonte disponível no GitHub (licenciado pelo MIT).
O uso é tão fácil quanto
fonte
"string".Replace
para oencode
método, mas um laço com substitui manuais para odecode
?Para obter uma codificação semelhante a base64 segura para URL, mas não "base64url" de acordo com RFC4648, use
System.Web.HttpServerUtility.UrlTokenEncode(bytes)
para codificar eSystem.Web.HttpServerUtility.UrlTokenDecode(bytes)
para decodificar.fonte
Solução mais simples: (sem preenchimento)
O crédito vai para: Tholle
fonte
Aqui está outro método para decodificar uma base64 segura para url foi codificada da mesma maneira com Marc. Eu simplesmente não entendo por que
4-length%4
funcionou (ele faz).Como segue, apenas o comprimento de bit da origem são múltiplos comuns de 6 e 8, base64 não acrescenta "=" ao resultado.
Portanto, podemos fazer isso inversamente, se o comprimento de bits do resultado não puder ser divisível por 8, ele foi anexado:
fonte
Usando o mecanismo criptográfico da Microsoft em UWP.
fonte
A resposta de Karanvir Kang é boa e eu votei a favor. No entanto, ele deixa um caractere ímpar no final da string (indicando o número de caracteres de preenchimento removidos). Aqui está minha solução.
fonte