Chcę kodować dane base64, aby umieścić je w adresie URL, a następnie zdekodować je w moim HttpHandler.
Odkryłem, że kodowanie Base64 umożliwia użycie znaku „/”, który zepsuje dopasowanie mojego UriTemplate. Potem odkryłem, że istnieje koncepcja „zmodyfikowanego Base64 dla adresu URL” z Wikipedii:
Istnieje zmodyfikowany Base64 dla wariantu adresu URL, w którym nie będzie używane dopełnienie „=”, a znaki „+” i „/” standardowego Base64 są odpowiednio zastępowane znakami „-” i „_”, dzięki czemu przy użyciu koderów / dekoderów adresów URL nie jest już konieczne i nie ma wpływu na długość zakodowanej wartości, pozostawiając tę samą zakodowaną postać nienaruszoną do użytku w relacyjnych bazach danych, formularzach internetowych i ogólnie w identyfikatorach obiektów.
Używając .NET Chcę zmodyfikować mój bieżący kod z podstawowego kodowania i dekodowania base64 na metodę „zmodyfikowanego base64 dla adresu URL”. Czy ktoś to zrobił?
Aby zdekodować, wiem, że zaczyna się od czegoś takiego:
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// Append '=' char(s) if necessary - how best to do this?
// My normal base64 decoding now uses encodedText
Ale muszę potencjalnie dodać jeden lub dwa znaki „=” na końcu, co wygląda na nieco bardziej złożone.
Moja logika kodowania powinna być trochę prostsza:
// 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('/', '_');
Widziałem Guid to Base64 dla wpisu URL StackOverflow, ale ma on znaną długość i dlatego może na stałe zakodować liczbę znaków równości potrzebnych na końcu.
Odpowiedzi:
Powinno to poprawnie wypełnić: -
źródło
Sprawdź również klasę HttpServerUtility z metodami UrlTokenEncode i UrlTokenDecode, które obsługują bezpieczne kodowanie i dekodowanie Base64 w formacie URL.
Uwaga 1: wynik nie jest prawidłowym ciągiem Base64. Niektóre niebezpieczne znaki w adresie URL są zastępowane.
Uwaga 2: Wynik różni się od algorytmu base64url w dokumencie RFC4648.
źródło
UrlTokenEncode
nie jest to ściśle base64url , ponieważ zastępuje on dopełnienie „=” wartością „0”, „1” lub „2” w zależności od liczby zastąpionych znaków równości.Za mało punktów do skomentowania, ale na wypadek, gdyby to pomogło, fragment kodu, który Sushil znalazł w podanym łączu (wersja robocza JSON Web Signature ietf) działa podczas kodowania Base 64 jako parametru w adresie URL.
Skopiowany fragment poniżej dla leniwych:
źródło
Trafiłem tutaj, szukając kodu do kodowania / dekodowania do kodowania base64url, które jest trochę inne niż base64, jak wyjaśniono w pytaniu.
Znaleziono fragment kodu C # w tym dokumencie. Szkic ietf podpisu internetowego JSON
źródło
W porównaniu z zaakceptowaną odpowiedzią, oto jak zasadniczo zdekodowałbyś adres URL zakodowany w base64, używając C #:
Rozszyfrować:
źródło