Frage

Ich mag base64 kodieren Daten, die sie in einer URL setzen und dekodieren es dann in meinem Httphandler.

Ich habe festgestellt, dass Base64 Encoding für ein Zeichen ‚/‘ erlaubt die vermasseln meine UriTemplate Matching. Dann fand ich, dass es ein Konzept eines „modifizierten Base64 für URL“ ist von wikipedia:

A Base64 für URL Variante modifizierte existiert, in dem kein padding ‚=‘ verwendet wird, sowie die ‚+‘ und ‚/‘ Zeichen von Standard Base64 jeweils ersetzt durch ‚-‘ und ‚_‘, so dass URL Encoder / Decoder ist nicht mehr notwendig und hat keine Auswirkungen auf der Länge des Wertes codierte, die gleiche codierte Form intakt für den Einsatz in relationalen Datenbanken, Web-Formularen und Objekt-Identifikatoren in der Regel verlassen.

Mit .NET Ich möchte zu tun, grundlegende Base64-Codierung und Decodierung mit der „modifizierten Base64 für URL“ Methode meine aktuellen Code ändern. Hat jemand dies getan?

Zur Decodierung, ich weiß, es beginnt mit so etwas wie:

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

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

// My normal base64 decoding now uses encodedText

Aber, ich brauche möglicherweise einem oder zwei Zeichen ‚=‘ bis zum Ende hinzuzufügen, die ein wenig komplexer aussieht.

Meine Codierung Logik sollte ein wenig einfacher sein:

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

Ich habe die Guid gesehen Stackoverflow-Eintrag für URL Base64, aber das hat eine bekannte Länge und daher können sie die Anzahl der Gleichheitszeichen am Ende benötigt codieren.

War es hilfreich?

Lösung

Dies sollte es polstern richtig: -

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

Andere Tipps

Überprüfen Sie auch Klasse HttpServerUtility mit UrlTokenEncode und UrlTokenDecode Methoden, die URL sichere Base64-Codierung und Decodierung verarbeitet.

Anmerkung 1: Das Ergebnis ist kein gültiger Base64-String. Einige unsichere Zeichen für URL ersetzt werden.

Hinweis. 2: Das Ergebnis unterscheidet sich von dem base64url Algorithmus in 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);
}

Nicht genügend Punkte zu kommentieren, aber im Fall hilft es, den Code-Schnipsel, dass Sushil in der Verbindung gefunden versehen (JSON Web Signature IETF-Entwurf) arbeitet für beim Encodieren Base 64 als Parameter in URL.

Kopiert Snippet für diejenigen, die faul sind:

    static string Base64UrlEncode(byte[] arg)
    {
        string s = Convert.ToBase64String(arg); // Regular base64 encoder
        s = s.Split('=')[0]; // Remove any trailing '='s
        s = s.Replace('+', '-'); // 62nd char of encoding
        s = s.Replace('/', '_'); // 63rd char of encoding
        return s;
    }

    static byte[] Base64UrlDecode(string arg)
    {
        string s = arg;
        s = s.Replace('-', '+'); // 62nd char of encoding
        s = s.Replace('_', '/'); // 63rd char of encoding
        switch (s.Length % 4) // Pad with trailing '='s
        {
            case 0: break; // No pad chars in this case
            case 2: s += "=="; break; // Two pad chars
            case 3: s += "="; break; // One pad char
            default: throw new System.Exception(
              "Illegal base64url string!");
        }
        return Convert.FromBase64String(s); // Standard base64 decoder
    }

ich hier schlagen, während für die Code-Suche Encoder / Decoder für base64url Codierung zu tun, die als base64 wenig anders ist als in der Frage erklärt.

Gefunden c # Code-Schnipsel in diesem Dokument. JSON Web Unterschrift ietf Entwurf

Im Vergleich zu der Antwort akzeptiert, hier ist, wie man es im Grunde dekodieren eine Base64-codierte URL, mit C #:

Decode:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top