121

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

我发现Base64 编码允许使用“/”字符,这会弄乱我的 UriTemplate 匹配。然后我发现维基百科中有一个“修改后的Base64 for URL”的概念:

存在一个修改过的 Base64 for URL 变体,其中不使用填充“=”,标准 Base64 的“+”和“/”字符分别替换为“-”和“_”,以便使用 URL 编码器/解码器不再需要并且对编码值的长度没有影响,从而使相同的编码形式保持不变,以便在关系数据库、Web 表单和一般对象标识符中使用。

使用 .NET 我想修改我当前的代码,从进行基本的 base64 编码和解码到使用“为 URL 修改 base64”方法。有人做过吗?

要解码,我知道它从以下内容开始:

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 StackOverflow 条目的 Base64 的 Guid,但它的长度是已知的,因此他们可以硬编码最后需要的等号数量。

4

5 回答 5

179

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

注 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);
}
于 2009-11-24T10:26:39.547 回答
79

这应该正确地填充它: -

 base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');
于 2009-08-04T17:06:33.223 回答
36

没有足够的评论点,但如果有帮助,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
    }
于 2015-10-13T22:40:00.347 回答
21

我在寻找代码对base64url编码进行编码/解码时点击这里,这与问题中解释的base64略有不同。

在本文档中找到 c# 代码片段。JSON Web 签名 ietf 草案

于 2013-01-16T08:23:14.160 回答
5

与接受的答案相比,以下是您如何使用 C# 从根本上解码base64 编码的 url:

解码:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
于 2016-01-07T01:40:04.510 回答