C#: 根据RFC4648标准的base64url

8
我正在寻找一个基于RFC4648的(快速)标准实现,用于在C#中进行base64url编码。
我发现HttpServerUtility.UrlTokenEncode,但看起来它不遵循RFC4648(UrlTokenEncode在末尾添加一个数字,表示删除的=符号数量;请参见这里这里)。
示例:
base64编码:
Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("AA")); //返回"QUE="
base64url编码:
HttpServerUtility.UrlTokenEncode(System.Text.Encoding.ASCII.GetBytes("AA")); //返回"QUE1",但我期望得到"QUE"

不要只是说“看起来像”,你能举个例子说明它实际上做了什么,与你的预期有何不同吗? - Jon Skeet
仍然相当模糊。请给出一个具体的例子:包含示例数据的示例代码,以及实际输出和期望输出。请阅读http://tinyurl.com/stack-hints。 - Jon Skeet
@JonSkeet: 好的,我添加了一个带有预期结果的示例。 - Dunken
1
简单的解决方案 - 只需使用 Substring 删除结果的最后一个字符。这样有什么问题吗? - Jon Skeet
@JonSkeet:不,听起来很好。我感到困惑是因为它没有在微软页面上记录... - Dunken
显示剩余2条评论
1个回答

9
根据评论,看起来System.Web.HttpServerUtility.UrlTokenEncode处理得很好,除了多余的填充字符。因此,您可以使用以下方式:
string customBase64 = HttpServerUtility.UrlTokenEncode(data);
string rfc4648 = customBase64.Substring(0, customBase64.Length - 1);

然而,您应该添加单元测试来检查它是否真的使用了RFC 4648字母表(并且以与RFC 4648相同的方式)。 文档非常稀少有点令人惊讶 :(


2
如果你想解码Jon的rfc4648,你需要再次添加额外的字符:if(rfc4648.Length%4 != 0) rfc4648 += (4 - rfc4648.Length%4); - Dunken
1
@Dunken:我认为你应该添加它,无论长度如何 - 但如果否则为4,则应该用0代替。 - Jon Skeet
4
添加了要点Base64UrlExtensions,希望对任何人都有用。它在string上提供编码和解码扩展功能。 - Darius
1
@Darius 在 .NET Core 中似乎无法工作,HttpServerUtility 在那里不存在。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接