对已修改的base64 URL进行解码/编码的代码

我想base64编码数据把它放在一个URL,然后解码它在我的HttpHandler。

我发现Base64编码允许一个'/'字符,这将弄乱我的UriTemplate匹配。 然后我发现wikipedia有一个“修改过的Base64 for URL”的概念:

存在用于URL变体的修改的Base64,其中将不使用填充“=”,并且将标准Base64的“+”和“/”字符分别replace为“ – ”和“_”,以便使用URL编码器/解码器不再是必需的,并且对编码值的长度没有影响,使得相同的编码forms保持原样用于关系数据库,网页表格和对象标识符。

使用.NET我想修改我现在的代码从做基本的base64编码和解码到使用“修改后的base64 for URL”方法。 有没有人做过这个?

为了解码,我知道它开始与像这样的东西:

string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/'); // Append '=' char(s) if necessary - how best to do this? // My normal base64 decoding now uses encodedText 

但是,我需要添加一个或两个'='字符到最后看起来更复杂一点。

我的编码逻辑应该更简单一些:

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

我已经看到了Guid Base64的URL StackOverflow条目,但是它有一个已知的长度,因此他们可以硬编码最后所需的等号的数量。

这应该正确地填写: –

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

同时使用UrlTokenEncode和UrlTokenDecode方法检查类HttpServerUtility是否处理URL安全的Base64编码和解码。

注1:结果不是有效的Base64string。 URL的一些不安全字符被replace。

注2:结果与RFC4648中的base64urlalgorithm不同。

 ///<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); } 

我在这里寻找代码来做base64url编码的编码/解码,这与base64有点不同,正如问题中所解释的。

在这个文档中find了c#代码片段。 JSON Web签名ietf草稿

没有足够的评论意见,但万一它有帮助,Sushil提供的链接(JSONnetworking签名ietf草案)中find的代码片段适用于编码基地64作为URL中的参数。

复制下面的那些懒惰的代码片段:

  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 } 

相比于接受的答案,这里是你将如何从根本上解码一个base64编码的url,使用C#:

解码:

 string codedValue = "base64encodedUrlHere"; string decoded; byte[] buffer = Convert.FromBase64String(codedValue); decoded = Encoding.UTF8.GetString(buffer);