2014-11-04 5 views
6

Sto cercando un'implementazione standard (veloce) per base64url in base a RFC4648 in C#.C#: base64url secondo RFC4648

ho trovato HttpServerUtility.UrlTokenEncode ma sembra che questo non segue RFC4648 (UrlTokenEncode aggiunge un numero alla fine, che indica il numero di = segni che sono stati rimossi, vedere here e here).

Esempio:

base64 codifica:

Convert.ToBase64String (System.Text.Encoding.ASCII.GetBytes ("AA")); // restituisce "QUE ="

base64url codifica:

HttpServerUtility.UrlTokenEncode (System.Text.Encoding.ASCII.GetBytes ("AA")); // restituisce "QUE1", ma mi aspetterei "QUE"

+0

Piuttosto che dire "sembra", puoi dare un esempio di cosa fa contro ciò che ti aspetteresti? –

+0

@JonSkeet: mi dispiace. ho aggiunto le mie preoccupazioni ... – Dunken

+0

È ancora abbastanza vago. Fornisci un esempio * concreto: codice di esempio contenente dati di esempio, con l'output effettivo e l'output previsto. Leggi http://tinyurl.com/stack-hints –

risposta

7

Sulla base delle osservazioni, suona come HttpServerUtility.UrlTokenEncode fa la cosa giusta tranne per il personaggio extra per imbottitura. Così si dovrebbe essere in grado di fare:

string customBase64 = HttpServerUtility.UrlTokenEncode(data); 
string rfc4648 = customBase64.Substring(0, customBase64.Length - 1); 

Tuttavia, si dovrebbe aggiungere unit test per controllare che lo fa davvero utilizzare la RFC 4648 alfabeto (e allo stesso modo come RFC 4648). È un po 'sorprendente che i documenti siano così rari :(

+2

Nel caso in cui tu voglia o decode ('UrlTokenDecode') Jon' rfc4648' devi aggiungere di nuovo il carattere extra: 'if (rfc4648.Length% 4! = 0) rfc4648 + = (4 - rfc4648.Length% 4);' – Dunken

+1

@Dunken: Credo che dovresti aggiungerlo a prescindere dalla lunghezza - ma con 0 anziché 4, se fosse altrimenti 4. –

+0

Hai ragione! (come sempre ;-)) – Dunken