c# - convert - encode online
¿Cómo lograr la codificación segura de la URL Base64 en C#? (7)
Aquí hay otro método para decodificar una base64 segura para la 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 múltiplo común de 6 y 8, base64 no agrega "=" al resultado.
1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8
1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6
"==" "="
Entonces, podemos hacerlo a la inversa, si la longitud del bit del resultado no puede dividirse entre 8, se ha agregado:
base64String = base64String.Replace("-", "+").Replace("_", "/");
var base64 = Encoding.ASCII.GetBytes(base64String);
var padding = base64.Length * 3 % 4;//(base64.Length*6 % 8)/2
if (padding != 0)
{
base64String = base64String.PadRight(base64String.Length + padding, ''='');
}
return Convert.FromBase64String(base64String);
Quiero lograr la codificación segura de la URL Base64 en C #. En Java, tenemos la biblioteca común de Codec
que me da una cadena codificada segura de 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 manera de lograr la codificación segura de URL?
Basado en las respuestas aquí con algunas mejoras en el rendimiento, hemos publicado una implementación de base64 url segura muy fácil de usar para NuGet con el código fuente disponible en GitHub (licencia MIT).
El uso es tan fácil como
var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);
Es común simplemente cambiar el alfabeto para su uso en urls, por lo que no es necesario codificar en%; solo 3 de los 65 caracteres son problemáticos - +
, /
y =
. los reemplazos más comunes son -
en lugar de +
y _
en lugar de /
. En cuanto al relleno: simplemente elimínalo (the =
); puede inferir la cantidad de relleno necesaria. En el otro extremo: simplemente invierta el proceso:
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes)
.TrimEnd(padding).Replace(''+'', ''-'').Replace(''/'', ''_'');
con:
static readonly char[] padding = { ''='' };
y para revertir:
string incoming = returnValue
.Replace(''_'', ''/'').Replace(''-'', ''+'');
switch(returnValue.Length % 4) {
case 2: incoming += "=="; break;
case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
string originalText = Encoding.ASCII.GetString(bytes);
La pregunta interesante, sin embargo, es: ¿ es este el mismo enfoque que usa la "biblioteca común de códecs"? Sin duda, sería una primera prueba razonable: este es un enfoque bastante común.
Otra opción, si está utilizando ASP.NET Core, sería usar Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.
Si no está utilizando ASP.NET Core, el origen de WebEncoders
está disponible bajo la licencia de Apache 2.0 .
Puede usar la clase Base64UrlEncoder
del espacio de nombres Microsoft.IdentityModel.Tokens
.
const string StringToEncode = "He=llo+Wo/rld";
var encodedStr = Base64UrlEncoder.Encode(StringToEncode);
var decodedStr = Base64UrlEncoder.Decode(encodedStr);
if (decodedStr == StringToEncode)
Console.WriteLine("It works!");
else
Console.WriteLine("Dangit!");
Usando el motor criptográfico de Microsoft en UWP.
uint length = 32;
IBuffer buffer = CryptographicBuffer.GenerateRandom(length);
string base64Str = CryptographicBuffer.EncodeToBase64String(buffer)
// ensure url safe
.TrimEnd(''='').Replace(''+'', ''-'').Replace(''/'', ''_'');
return base64Str;
Use System.Web.HttpServerUtility.UrlTokenEncode (bytes) para codificar, y System.Web.HttpServerUtility.UrlTokenDecode (bytes) para decodificar.