用于解码/编码修改后的base64 URL的代码

Kir*_*ohn 108 c# url base64 encode decode

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

我发现Base64编码允许使用'/'字符,这会弄乱我的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
Run Code Online (Sandbox Code Playgroud)

但是,我需要在结尾处添加一个或两个'='字符,这看起来有点复杂.

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

// 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('/', '_');
Run Code Online (Sandbox Code Playgroud)

我已经看到Guid to Base64用于URL StackOverflow条目,但是它具有已知长度,因此它们可以硬编码最后所需的等号数.

Fre*_*und 173

还要使用处理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);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`UrlTokenEncode`不是严格的[base64url](http://tools.ietf.org/html/rfc4648#section-5),因为它用'0','1'或'2替换'='填充'取决于它取代了多少等号. (14认同)
  • 你的小费是一个多小时和发束搜索答案的光荣结束.谢谢 (12认同)

Ant*_*nes 65

这应该正确填写: -

 base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');
Run Code Online (Sandbox Code Playgroud)

  • 呸,你打败了我.我只是删除我的帖子因为它看起来几乎像我复制了你:) (11认同)
  • 这不会加起来三个'='字符?似乎只有0,1或2个. (2认同)
  • @AnthonyWJones'它应该只包含预期的字符和长度%4!=**1**',对吗? (2认同)

Ste*_*nar 25

没有足够的评论点,但如果有帮助,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
    }
Run Code Online (Sandbox Code Playgroud)


Sus*_*hil 19

我在寻找代码进行base64url编码的编码/解码时遇到了这里,这与base64有点不同,如问题所述.

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

  • 这是在GMail API v1(Message.Raw)中解析消息时唯一对我有用的解决方案。 (2认同)

Chr*_*row 5

与接受的答案相比,以下是使用C#从根本上解码 base64编码的URL的方法:

解码:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);
Run Code Online (Sandbox Code Playgroud)