Je veux encoder des données en base64 pour les mettre dans une URL, puis les décoder dans mon HttpHandler.
J'ai trouvé que l' encodage Base64 permet un caractère «/» qui va gâcher ma correspondance UriTemplate. Ensuite, j'ai trouvé qu'il existe un concept de "Base64 modifiée pour l'URL" de wikipedia:
Une variante Base64 modifiée pour l'URL existe, où aucun remplissage '=' ne sera utilisé, et les caractères '+' et '/' de la norme Base64 sont respectivement remplacés par '-' et '_', de sorte que l'utilisation des encodeurs / décodeurs d'URL n'est plus nécessaire et n'a aucun impact sur la longueur de la valeur codée, laissant la même forme codée intacte pour une utilisation dans les bases de données relationnelles, les formulaires Web et les identificateurs d'objets en général.
En utilisant .NET Je souhaite modifier mon code actuel, passant de l'encodage et du décodage base64 à l'utilisation de la méthode "base64 modifiée pour l'URL". Quelqu'un at-il fait ça?
Pour décoder, je sais que cela 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'ajouter potentiellement un ou deux caractères '=' à la fin, ce qui semble un peu plus complexe.
Ma logique d'encodage 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 to Base64 pour l' entrée URL StackOverflow, mais cela a une longueur connue et ils peuvent donc coder en dur le nombre de signes égaux nécessaires à la fin.
Réponses:
Cela devrait le compléter correctement: -
la source
Vérifiez également la classe HttpServerUtility avec les méthodes UrlTokenEncode et UrlTokenDecode qui gèrent le codage et le décodage en Base64 sécurisés pour les URL.
Remarque 1: le résultat n'est pas une chaîne Base64 valide. Certains caractères non sécurisés pour l'URL sont remplacés.
Remarque 2: Le résultat diffère de l'algorithme base64url dans RFC4648.
la source
UrlTokenEncode
n'est pas strictement base64url , car il remplace le remplissage '=' par '0', '1' ou '2' selon le nombre de signes égaux qu'il a remplacé.Pas assez de points pour commenter, mais au cas où cela aiderait, l'extrait de code que Sushil a trouvé dans le lien fourni (JSON Web Signature ietf draft) fonctionne lors de l'encodage de Base 64 en tant que paramètre dans l'URL.
Extrait copié ci-dessous pour ceux qui sont paresseux:
la source
J'ai frappé ici en cherchant du code à encoder / décoder pour l'encodage base64url qui est peu différent de base64 comme expliqué dans la question.
Extrait de code c # trouvé dans ce document. Brouillon ietf de signature Web JSON
la source
En comparaison avec la réponse acceptée, voici comment décoder fondamentalement une URL encodée en base64, en utilisant C #:
Décoder:
la source