122 votes

Code pour le décodage/encodage d'une modification de la base64 URL

Je veux base64 encode les données à mettre dans une URL et puis le décoder à l'intérieur de mon HttpHandler.

J'ai trouvé que le Codage Base64 permet un caractère '/' qui va gâcher mon UriTemplate de correspondance. Ensuite, j'ai trouvé qu'il y a une notion de "modifié en Base64 pour les URL" de wikipedia:

Une modification de la Base64 pour les URL variante existe, où aucun rembourrage '=' sera utilisé, et le '+' et '/' caractères de la norme en Base64, sont respectivement remplacées par " - "et"_", afin que l'aide de l'URL des encodeurs/décodeurs n'est plus nécessaire et n'a aucune incidence sur la longueur de la valeur codée, laissant la même forme codée intact pour une utilisation dans des bases de données relationnelles, des formulaires web, et les identificateurs d'objet en général.

À l'aide de .NET je veux modifier mon code de base de l'encodage base64 et de décodage à l'aide de la "modifié base64 "URL" la méthode. Quelqu'un a fait cela?

Pour décoder, je sais que ça commence par quelque chose comme:

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

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

// My normal base64 decoding now uses encodedText

Mais, j'ai besoin d'éventuellement ajouter un ou deux '=' caractères à la fin qui ressemble un peu plus complexe.

Mon codage de la logique devrait être un peu plus simple:

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

J'ai vu le Guid en Base64 pour les URL StackOverflow entrée, mais qui a une longueur connue et, par conséquent, ils peuvent coder en dur le nombre de signes égal nécessaires à la fin.

180voto

Fredrik Haglund Points 1701

Vérifiez également la classe HttpServerUtility avec UrlTokenEncode et UrlTokenDecode méthodes de manutention URL sûr Base64 d'encodage et de décodage.

Note 1: Le résultat n'est pas valide en Base64 de la chaîne. Certains caractères déconseillés pour les URL sont remplacés.

Note 2: Le résultat diffère du base64url de l'algorithme dans 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);
}

82voto

AnthonyWJones Points 122520

Cela devrait pad il correctement:-

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

21voto

Sushil Points 1573

J'ai frappé ici, alors que la recherche de code pour coder/décoder pour base64url encodage qui est un peu différent de base64, comme expliqué dans la question.

Trouvé extrait de code c# dans le présent document. JSON Web de la Signature de l'ietf projet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X