Domanda

Voglio base64 codificare i dati per metterli in un URL e quindi decodificarli nel mio HttpHandler.

Ho scoperto che Codifica Base64 consente un carattere "/" che rovinerà il mio Corrispondenza UriTemplate. Poi ho scoperto che esiste un concetto di "Base64 modificato per URL" da Wikipedia:

Esiste una variante di Base64 modificata per URL, in cui non verrà utilizzato alcun riempimento '=' e i caratteri '+' e '/' dello standard Base64 vengono rispettivamente sostituiti da '-' e '_', in modo che l'utilizzo dell'URL codificatori / decodificatori non è più necessario e non ha alcun impatto sulla lunghezza del valore codificato, lasciando intatto lo stesso modulo codificato per l'uso in database relazionali, moduli Web e identificatori di oggetti in generale.

Usando .NET voglio modificare il mio codice attuale da codifica e decodifica base64 base all'utilizzo di "base64 modificato per URL"; metodo. Qualcuno l'ha fatto?

Per decodificare, so che inizia con qualcosa del tipo:

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

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

// My normal base64 decoding now uses encodedText

Ma devo aggiungere potenzialmente uno o due caratteri '=' alla fine che sembrano un po 'più complessi.

La mia logica di codifica dovrebbe essere un po 'più semplice:

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

Ho visto la Guida a Base64 per URL StackOverflow, ma che ha una lunghezza nota e quindi possono codificare il numero di segni uguali necessari alla fine.

È stato utile?

Soluzione

Questo dovrebbe completarlo correttamente: -

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

Altri suggerimenti

Controlla anche la classe HttpServerUtility con i metodi UrlTokenEncode e UrlTokenDecode che gestisce la codifica e la decodifica Base64 protette da URL.

Nota 1: il risultato non è una stringa Base64 valida. Alcuni caratteri non sicuri per l'URL vengono sostituiti.

Nota 2: il risultato differisce dall'algoritmo base64url 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);
}

Non ci sono abbastanza punti per commentare, ma in caso di aiuto, lo snippet di codice che Sushil ha trovato nel collegamento fornito (bozza ietf JSON Web Signature) funziona quando si codifica Base 64 come parametro nell'URL.

Snippet copiato di seguito per coloro che sono pigri:

    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
    }

Ho cliccato qui mentre cercavo il codice per fare la codifica / decodifica per la codifica base64url che è leggermente diversa dalla base64 come spiegato nella domanda.

Trovato frammento di codice c # in questo documento. Bozza ietf della firma Web JSON

Rispetto alla risposta accettata, ecco come fondamentalmente decodifichi un URL codificato in base64, usando C #:

Decodifica:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top