Chcę osiągnąć bezpieczne kodowanie adresu URL Base64 w C #. W Javie mamy wspólną Codec
bibliotekę, która daje mi bezpieczny zakodowany łańcuch. Jak mogę osiągnąć to samo za pomocą C #?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Powyższy kod konwertuje go na Base64, ale wypełnia ==
. Czy istnieje sposób na zapewnienie bezpiecznego kodowania adresów URL?
Url.Encode
na sznurkuBASE64
?System.Web
zestawu.url safe
?%3D
jest bezpieczny dla adresu URL.Odpowiedzi:
Zwykle po prostu zamienia się alfabet na potrzeby adresów URL, dzięki czemu nie jest konieczne kodowanie%; tylko 3 z 65 znaków są problematyczne -
+
,/
i=
. Najczęstszym zamienniki są-
na miejscu+
i_
na miejscu/
. Co do wyściółki: wystarczy ją usunąć (the=
); można wywnioskować ilość potrzebnej wyściółki. Z drugiej strony: po prostu odwróć proces:z:
i odwrócić:
Jednak interesujące pytanie brzmi: czy jest to to samo podejście, którego używa „biblioteka wspólnych kodeków”? Z pewnością rozsądnie byłoby najpierw przetestować - to dość powszechne podejście.
źródło
==
dopełnieniem, 2x8 jest kodowane jako 3x6 z=
dopełnieniem, 3x8 jest kodowane jako 4x6 bez dopełnienia, a następnie jest wyrównane, aby się powtarzało. Nic nie jest nigdy kodowane do bitów 1x6, więc nigdy nie potrzebujesz===
dopełniania.Możesz użyć klasy
Base64UrlEncoder
z przestrzeni nazwMicrosoft.IdentityModel.Tokens
.źródło
Inną opcją, jeśli używasz ASP.NET Core, byłoby użycie
Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
.Jeśli nie używasz ASP.NET Core źródłowy jest dostępny pod Apache 2.0 License .
WebEncoders
źródło
Opierając się na odpowiedziach tutaj z pewnymi ulepszeniami wydajności, opublikowaliśmy bardzo łatwą w użyciu implementację base64 z bezpiecznym adresem URL w NuGet z kodem źródłowym dostępnym w GitHub (na licencji MIT).
Użycie jest tak proste, jak
źródło
"string".Replace
tęencode
metodę, ale pętla z ręcznym zastąpieniemdecode
?Aby uzyskać bezpieczne kodowanie w formacie base64, ale nie „base64url” zgodnie z RFC4648, użyj
System.Web.HttpServerUtility.UrlTokenEncode(bytes)
do kodowania iSystem.Web.HttpServerUtility.UrlTokenDecode(bytes)
dekodowania.źródło
Najprostsze rozwiązanie: (bez wypełnienia)
Kredyt trafia do: Tholle
źródło
Oto inna metoda dekodowania bezpiecznego adresu URL base64, który został zakodowany w ten sam sposób z Markiem. Po prostu nie rozumiem, dlaczego
4-length%4
zadziałało (działa).Jak poniżej, tylko długość bitu początku jest wspólną wielokrotnością 6 i 8, base64 nie dodaje „=” do wyniku.
Możemy więc zrobić to na odwrót, jeśli długość bitu wyniku nie może być podzielna przez 8, została dodana:
źródło
Korzystanie z aparatu kryptograficznego firmy Microsoft na platformie UWP.
źródło
Odpowiedź Karanvira Kanga jest dobra i głosowałem za nią. Jednak na końcu ciągu pozostawia nieparzysty znak (wskazujący liczbę usuniętych znaków wypełniających). Oto moje rozwiązanie.
źródło