我想实现在C#中的Base64 URL编码的安全。 在Java中,我们有共同的Codec
库,它给了我一个网址安全编码的字符串。 我怎样才能达到相同的使用C#?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
上面的代码将其转换为Base64,但它焊盘==
。 是否有办法实现网址安全编码?
这是常见的简单交换字母在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);
一个有趣的问题,却是: 这是相同的做法,即“共同编解码器库”使用? 这无疑将是检验一个合理的第一件事情 - 这是一个很常见的做法。
您可以使用类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!");
基于在这里下车了一些性能改进问题的答案,我们发表了一篇非常好用网址安全base64实施的NuGet的源代码在GitHub上available (MIT许可)。
用法是一样简单
var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);
使用System.Web.HttpServerUtility.UrlTokenEncode(字节)来编码,并System.Web.HttpServerUtility.UrlTokenDecode(字节)进行解码。
另一种选择,如果你正在使用ASP.NET的核心,是使用Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode
。
如果你不使用ASP.NET的核心, 该WebEncoders
源下可Apache 2.0许可 。
下面是用于解码网址安全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);
在UWP使用Microsoft加密引擎。
uint length = 32;
IBuffer buffer = CryptographicBuffer.GenerateRandom(length);
string base64Str = CryptographicBuffer.EncodeToBase64String(buffer)
// ensure url safe
.TrimEnd('=').Replace('+', '-').Replace('/', '_');
return base64Str;