static public string GetRandomSalt(int saltLength)
{
byte[] saltByte = new byte[saltLength];
using (var random = new RNGCryptoServiceProvider())
{
random.GetBytes(saltByte);
}
return Convert.ToBase64String(saltByte);
}
因此,如果盐长度为8,它将返回一些随机字符串,但以'='结尾,如何避免呢?看了其他堆栈溢出解决方案,但仍然无法解决
答案 0 :(得分:1)
您只能避免使用Base64填充,请参见here。另请参见Base64 specification。
我建议使用salt作为字节数组。
答案 1 :(得分:0)
问题与RNGCryptoServiceProvider
的使用无关,而是您将结果转换为base-64。
无值字符“ =”用于尾随填充。
因此,我可以想到三种选择:
=
进行填充的事实。第3点示例:
Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})
产生
AQIDBAUGBwgJ
答案 2 :(得分:0)
等号正在填充。当您转换为base64字符串的字节数不是三的倍数时,将添加此填充。
基本上是这样的:
number of bytes % 3 == 0 -> no padding
number of bytes % 3 == 1 -> == padding
number of bytes % 3 == 2 -> = padding
答案 3 :(得分:0)
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();
}