我想将base64编码数据放入URL中,然后在我的HttpHandler中对其进行解码。
我发现Base64 Encoding允许使用'/'字符,这会弄乱我的UriTemplate匹配。然后我发现维基百科有一个“修改过的Base64 for URL”的概念:
存在已修改的URL变体Base64,其中不使用填充'=',标准Base64的'+'和'/'字符分别替换为' - '和'_',因此使用URL编码器/解码器不再是必需的,并且对编码值的长度没有影响,保留相同的编码形式,通常用于关系数据库,Web表单和对象标识符。
使用.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 to Base64 for URL StackOverflow条目,但它具有已知长度,因此它们可以硬编码最后所需的等号数。
答案 0 :(得分:172)
同时使用处理URL安全Base64编码和解码的UrlTokenEncode和UrlTokenDecode方法检查类 HttpServerUtility 。
注1:结果不是有效的Base64字符串。 URL的某些不安全字符已被替换。
注2:结果与RFC4648中的base64url算法不同。
///<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);
}
答案 1 :(得分:60)
这应该正确填写: -
base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');
答案 2 :(得分:24)
没有足够的评论点,但如果有帮助,Sushil在提供的链接中找到的代码片段(JSON Web Signature ietf draft)适用于将Base 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
}
答案 3 :(得分:19)
我在寻找代码进行base64url编码的编码/解码时遇到了这个问题,这与base64略有不同,如问题所述。
在本文档中找到了c#代码段。 JSON Web Signature ietf draft
答案 4 :(得分:5)
与接受的答案相比,以下是如何使用C#从根本上解码 base64编码的网址:
<强>解码:强>
string codedValue = "base64encodedUrlHere";
string decoded;
byte[] buffer = Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);