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

我已发现 base64编码允许“/”字符这将弄乱我的UriTemplate匹配。然后,我发现,有来自维基百科“改性的Base64 URL”一个概念:

改性的Base64 URL变体

A存在,其中没有填充“=”将被使用,以及标准的Base64的“+”和“/”字符被分别替换为“ - ”和“_”,因此使用URL编码器/解码器不再需要,并且对所述经编码值的长度没有影响,而使相同的编码形式原封不动在关系数据库中,web表单,并在一般对象标识符的使用。

使用.NET我想从做基本base64编码和解码,以使用“经修饰的base64为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为网址 StackOverflow的条目,但是,其具有已知长度,因此,它们可以硬编码的在端部所需等号的数量。

有帮助吗?

解决方案

此应该正确地垫出来: -

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

其他提示

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

注意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);
}

没有足够的点评论,但在情况下有帮助,所述代码片段在苏希尔提供的链接(JSON网络签名IETF草案)的工作中发现编码基本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
    }

我打这里同时寻找代码来执行编码/解码用于编码base64url如问题解释为比BASE64有点不同。

本文档中找到的C#代码段。 JSON网络签名 IETF草案

在比较公认的答案,这里是你将如何从根本上的解码的base64编码的网址,使用C#:

<强>解码:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top