如何在C#中实现Base64 URL安全编码?

Vis*_*nis 88 c# base64 encoding

我想在C#中实现Base64 URL安全编码.在Java中,我们有一个公共Codec库,它为我提供了一个URL安全编码字符串.如何使用C#实现相同的目标?

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Run Code Online (Sandbox Code Playgroud)

上面的代码将它转换为Base64,但它填充==.有没有办法实现URL安全编码?

Mar*_*ell 159

通常只需交换字母表以便在网址中使用,这样就不需要%编码; 只有65个字符的3是有问题- +,/=.最常见的替代品-代替+_替代/.至于填充:只需删除它(=); 你可以推断出所需的填充量.在另一端:只需逆转过程:

string returnValue = System.Convert.ToBase64String(toEncodeAsBytes)
        .TrimEnd(padding).Replace('+', '-').Replace('/', '_');
Run Code Online (Sandbox Code Playgroud)

有:

static readonly char[] padding = { '=' };
Run Code Online (Sandbox Code Playgroud)

并扭转:

string incoming = returnValue
    .Replace('_', '/').Replace('-', '+');
switch(returnValue.Length % 4) {
    case 2: incoming += "=="; break;
    case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
string originalText = Encoding.ASCII.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)

然而,有趣的问题是:这与"通用编解码器库"使用的方法相同吗?测试肯定是合理的第一件事 - 这是一种非常常见的方法.

  • 您还可以使用此功能"http://stackoverflow.com/questions/1886686/c-sharp-byte-to-url-friendly-string"为您完成所有艰苦的工作. (2认同)
  • 为什么我们不需要:案例1:传入+=“===”;休息; ? (2认同)
  • @alexdafranca,因为它将永远不会具有1的长度mod4。3x8位变成4x6位(并且每个6位是所选字母中64个字符之一),0x8位被编码为0x6位而没有填充,1x8位被编码为带有“ ==”填充的2x6位,带有“ =”填充的2x8被编码为3x6,没有填充的3x8被编码为4x6,然后将其对齐以便​​重复。没有任何东西编码为1x6比特,因此您不需要`===`填充。 (2认同)

Jer*_*ome 69

您可以使用Base64UrlEncoder命名空间中的类Microsoft.IdentityModel.Tokens.

const string StringToEncode = "He=llo+Wo/rld";

var encodedStr = Base64UrlEncoder.Encode(StringToEncode);
var decodedStr = Base64UrlEncoder.Decode(encodedStr);

if (decodedStr == StringToEncode)
    Console.WriteLine("It works!");
else
    Console.WriteLine("Dangit!");
Run Code Online (Sandbox Code Playgroud)

  • 请注意:Microsoft.IdentityModel.Tokens是一个必须下载的NuGet包. (16认同)
  • 这比接受的答案要干净得多。有什么缺点吗? (2认同)

Kev*_*oid 10

如果您使用的是ASP.NET Core,则另一种选择是使用Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode

如果您未使用ASP.NET Core,则WebEncoders可在Apache 2.0 License获得


Kar*_*ang 8

使用System.Web.HttpServerUtility.UrlTokenEncode(bytes)进行编码,并使用System.Web.HttpServerUtility.UrlTokenDecode(bytes)进行解码.

  • 根据RFC4648,这不提供符合标准的URL安全Base64编码.另见[此问答](http://stackoverflow.com/questions/26732145/c-base64url-according-to-rfc4648).**谨慎使用.** (4认同)

Mah*_*dsi 8

基于在这里下车了一些性能改进问题的答案,我们发表了一篇非常好用网址安全base64实施的NuGet的源代码在GitHub上可用的(MIT许可).

用法很简单

var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);
Run Code Online (Sandbox Code Playgroud)