Je souhaite obtenir un encodage sécurisé d'URL Base64 en C #. En Java, nous avons la Codec
bibliothèque commune qui me donne une chaîne codée URL sécurisée. Comment puis-je réaliser la même chose en utilisant C #?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Le code ci-dessus le convertit en Base64, mais il complète ==
. Existe-t-il un moyen d'obtenir un encodage sécurisé des URL?
Url.Encode
chaîneBASE64
?System.Web
assembly.url safe
?%3D
est une url sûre.Réponses:
Il est courant d' échanger simplement l'alphabet pour une utilisation dans les URL, de sorte qu'aucun% -encoding n'est nécessaire; seuls 3 des 65 caractères sont problématiques -
+
,/
et=
. les remplacements les plus courants sont-
à la place+
et_
à la place de/
. Quant au rembourrage: il suffit de le retirer (le=
); vous pouvez déduire la quantité de rembourrage nécessaire. À l'autre extrémité: inversez simplement le processus:avec:
et inverser:
La question intéressante, cependant, est: est-ce la même approche que la "bibliothèque de codecs communs" utilise? Ce serait certainement une première chose raisonnable à tester - c'est une approche assez courante.
la source
==
padding, 2x8 est encodé en 3x6 avec=
padding, 3x8 est encodé en 4x6 sans padding, puis il est aligné pour qu'il se répète. Rien n'est jamais encodé en 1x6 bits, vous n'avez donc jamais besoin de===
remplissage.Vous pouvez utiliser la classe
Base64UrlEncoder
de l'espace de nomsMicrosoft.IdentityModel.Tokens
.la source
Une autre option, si vous utilisez ASP.NET Core, serait d'utiliser
Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.Si vous n'utilisez pas ASP.NET Core, la
WebEncoders
source est disponible sous la licence Apache 2.0 .la source
Sur la base des réponses ici avec quelques améliorations de performances, nous avons publié une implémentation base64 sécurisée pour les URL très facile à utiliser dans NuGet avec le code source disponible sur GitHub (licence MIT).
L'utilisation est aussi simple que
la source
"string".Replace
laencode
méthode, mais une boucle avec manuel remplace ledecode
?Pour obtenir un encodage de type base64 sécurisé pour les URL, mais pas "base64url" selon RFC4648, utilisez
System.Web.HttpServerUtility.UrlTokenEncode(bytes)
pour encoder etSystem.Web.HttpServerUtility.UrlTokenDecode(bytes)
pour décoder.la source
Solution la plus simple: (sans rembourrage)
Le mérite revient à: Tholle
la source
Voici une autre méthode pour décoder une url-safe base64 qui a été encodée de la même manière avec Marc. Je ne comprends juste pas pourquoi
4-length%4
travaillé (c'est le cas).Comme suit, seules les longueurs en bits de l'origine sont des multiples communs de 6 et 8, base64 n'ajoute pas "=" au résultat.
Nous pouvons donc le faire à l'inverse, si la longueur en bits du résultat ne peut pas être divisible par 8, elle a été ajoutée:
la source
Utilisation du moteur cryptographique Microsoft dans UWP.
la source
La réponse de Karanvir Kang est bonne et j'ai voté pour. Cependant, il laisse un caractère impair à la fin de la chaîne (indiquant le nombre de caractères de remplissage supprimés). Voici ma solution.
la source