Quiero lograr una codificación segura de URL Base64 en C #. En Java, tenemos la Codec
biblioteca común que me da una cadena codificada segura para URL. ¿Cómo puedo lograr lo mismo usando C #?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
El código anterior lo convierte a Base64, pero rellena ==
. ¿Hay alguna forma de lograr una codificación segura de URL?
Url.Encode
cuerdaBASE64
?System.Web
ensamblado.url safe
?%3D
es URL segura.Respuestas:
Es común simplemente intercambiar el alfabeto para usarlo en las URL, por lo que no es necesaria la codificación%; sólo 3 de los 65 caracteres son problemáticos -
+
,/
y=
. los reemplazos más comunes están-
en lugar de+
y_
en lugar de/
. En cuanto al acolchado: simplemente quítelo (el=
); puede inferir la cantidad de relleno necesaria. En el otro extremo: simplemente invierta el proceso:con:
y para revertir:
Sin embargo, la pregunta interesante es: ¿ es este el mismo enfoque que utiliza la "biblioteca de códecs común"? Sin duda, sería una primera cosa razonable para probar; este es un enfoque bastante común.
fuente
==
relleno, 2x8 se codifica como 3x6 con=
relleno, 3x8 se codifica como 4x6 sin relleno y luego se alinea para que se repita. Nada está codificado en 1x6 bits, por lo que nunca necesita===
relleno.Puede usar la clase
Base64UrlEncoder
del espacio de nombresMicrosoft.IdentityModel.Tokens
.fuente
Otra opción, si está utilizando ASP.NET Core, sería utilizar
Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.Si no está utilizando ASP.NET Core, la
WebEncoders
fuente está disponible bajo la licencia Apache 2.0 .fuente
Basándonos en las respuestas aquí con algunas mejoras de rendimiento, hemos publicado una implementación de base64 segura para URL muy fácil de usar para NuGet con el código fuente disponible en GitHub (con licencia MIT).
El uso es tan fácil como
fuente
"string".Replace
elencode
método, pero un bucle con manual reemplaza aldecode
?Para obtener una codificación tipo base64 segura para URL, pero no "base64url" según RFC4648, utilice
System.Web.HttpServerUtility.UrlTokenEncode(bytes)
para codificar ySystem.Web.HttpServerUtility.UrlTokenDecode(bytes)
decodificar.fuente
Solución más simple: (sin relleno)
El crédito es para: Tholle
fuente
Aquí hay otro método para decodificar una base64 segura para URL que se codificó de la misma manera con Marc. Simplemente no entiendo por qué
4-length%4
funcionó (lo hace).De la siguiente manera, solo la longitud de bits del origen es un múltiplo común de 6 y 8, base64 no agrega "=" al resultado.
Entonces podemos hacerlo a la inversa, si la longitud de bits del resultado no puede ser divisible por 8, se ha agregado:
fuente
Usando el motor criptográfico de Microsoft en UWP.
fuente
La respuesta de Karanvir Kang es buena y yo voté a favor. Sin embargo, deja un carácter impar al final de la cadena (que indica el número de caracteres de relleno eliminados). Aquí está mi solución.
fuente