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

2019-05-10 09:25发布

我想实现在C#中的Base64 URL编码的安全。 在Java中,我们有共同的Codec库,它给了我一个网址安全编码的字符串。 我怎样才能达到相同的使用C#?

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

上面的代码将其转换为Base64,但它焊盘== 。 是否有办法实现网址安全编码?

Answer 1:

这是常见的简单交换字母在URL中使用,所以没有%编码是必要的; 只有65个字符的3是有问题- +/= 。 最常见的替代品是-代替+_代替/ 。 作为用于填充: 只是删除它= ); 可以推断需要填充量。 在另一端:刚刚相反的过程:

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

有:

static readonly char[] padding = { '=' };

并扭转:

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);

一个有趣的问题,却是: 这是相同的做法,即“共同编解码器库”使用? 这无疑将是检验一个合理的第一件事情 - 这是一个很常见的做法。



Answer 2:

您可以使用类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!");


Answer 3:

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

用法是一样简单

var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);


Answer 4:

使用System.Web.HttpServerUtility.UrlTokenEncode(字节)来编码,并System.Web.HttpServerUtility.UrlTokenDecode(字节)进行解码。



Answer 5:

另一种选择,如果你正在使用ASP.NET的核心,是使用Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode

如果你不使用ASP.NET的核心, 该WebEncoders源下可Apache 2.0许可 。



Answer 6:

下面是用于解码网址安全base64另一种方法是通过与马克同样的方式进行编码。 我只是不明白为什么4-length%4工作(它)。

如下,只有原点的位长度是6和8公倍数,BASE64不追加“=”造成的。

1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8 
1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6
                "=="            "="

因此,我们可以做到这一点反过来,如果结果的位长度不能被8整除,已追加:

base64String = base64String.Replace("-", "+").Replace("_", "/");
var base64 = Encoding.ASCII.GetBytes(base64String);
var padding = base64.Length * 3 % 4;//(base64.Length*6 % 8)/2
if (padding != 0)
{
    base64String = base64String.PadRight(base64String.Length + padding, '=');
}
return Convert.FromBase64String(base64String);


Answer 7:

在UWP使用Microsoft加密引擎。

uint length = 32;

IBuffer buffer = CryptographicBuffer.GenerateRandom(length);
string base64Str = CryptographicBuffer.EncodeToBase64String(buffer)
                   // ensure url safe
                   .TrimEnd('=').Replace('+', '-').Replace('/', '_');

return base64Str;


文章来源: How to achieve Base64 URL safe encoding in C#?