C# RNGCryptoServiceProvider随机字符串。始终返回以'=';
因此,如果salt长度为8,它将返回一些随机字符串,但以“=”结尾,如何避免它?查看了其他堆栈溢出解决方案,但仍然无法修复它这只是Base64填充,您无法避免,请参阅。另见C# RNGCryptoServiceProvider随机字符串。始终返回以'=';,c#,random,rngcryptoserviceprovider,C#,Random,Rngcryptoserviceprovider,因此,如果salt长度为8,它将返回一些随机字符串,但以“=”结尾,如何避免它?查看了其他堆栈溢出解决方案,但仍然无法修复它这只是Base64填充,您无法避免,请参阅。另见 我建议使用salt作为字节数组。问题与使用RNGCryptoServiceProvider无关,而是将结果转换为base-64 根据报告: 无值字符“=”用于尾随填充 因此,我可以想出三种选择: 停止使用base-64格式(可能返回字节本身) 接受base-64使用=填充的事实 传递一个不需要填充的长度,如9 第3点的例子:
我建议使用salt作为字节数组。问题与使用
RNGCryptoServiceProvider
无关,而是将结果转换为base-64
根据报告:
无值字符“=”用于尾随填充
因此,我可以想出三种选择:
=
填充的事实static public string GetRandomSalt(int saltLength)
{
byte[] saltByte = new byte[saltLength];
using (var random = new RNGCryptoServiceProvider())
{
random.GetBytes(saltByte);
}
return Convert.ToBase64String(saltByte);
}
产生
Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})
你不能解决它。您已经创建了一个base-64编码字符串,大概是为了传递给将对其进行base-64解码的某个对象/其他人(如果没有,为什么要进行转换?)。当他们解码时,他们希望=
在那里。
AQIDBAUGBwgJ
public static string GetUniqueKey(int maxSize)
{
char[] chars = new char[62];
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
byte[] data = new byte[1];
using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider())
{
crypto.GetNonZeroBytes(data);
data = new byte[maxSize];
crypto.GetNonZeroBytes(data);
}
StringBuilder result = new StringBuilder(maxSize);
foreach (byte b in data)
{
result.Append(chars[b % (chars.Length)]);
}
return result.ToString();
}