解码/编码修改后的 base64 URL 的代码(在 ASP.NET Framework 中)

我希望 base64编码数据,将其放入 URL 中,然后在我的 HttpHandler 中对其进行解码。

I have found that Base64编码 allows for a '/' character which will mess up my UriTemplate matching. Then I found that there is a concept of a "modified Base64 for URL" from wikipedia:

存在一个修改过的用于 URL 变体的 Base64,其中不使用填充“ =”,并且标准 Base64的“ +”和“/”字符分别被“-”和“ _”替换,因此使用 URL 编码器/解码器不再是必要的,并且对编码值的长度没有影响,保留相同的编码形式完整地用于关系数据库、 Web 表单和一般的对象标识符。

Using .NET I want to modify my current code from doing basic base64 encoding and decoding to using the "modified base64 for URL" method. Has anyone done this?

要解码,我知道它的开头是这样的:

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

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

103404 次浏览

这应该可以正确地填补它:-

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

还要使用处理 URL 安全的 Base64编码和解码的 UrlTokenEncode 和 UrlTokenDecode 方法检查类 HttpServerUtilityHttpServerUtilityHttpServerUtility

注1: 结果不是有效的 Base64字符串。 URL 的一些不安全字符被替换。

注2: 结果与 RFC4648中的 base64url 算法不同,它将’=’填充替换为’0’、’1’或’2’,具体取决于替换了多少个等号,以确保查询参数的值是安全的。

///<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 编码进行编码/解码的代码,正如问题中所解释的那样,base64url 编码与 base64几乎没有什么不同。

在这个文档中找到了 c # 代码片段

没有足够的注释,但是如果有帮助的话,Sushil 在提供的链接中找到的代码片段(JSON Web Signature ietf 草案)可以在 URL 中将 Base 64编码为参数时使用。

为懒惰的人复制下面的代码片段:

    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
}

In comparison to the accepted answer, here is how you would fundamentally decode a base64 encoded url, using C#:

译码:

string codedValue = "base64encodedUrlHere";


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