RNGCryptoServiceProvider случайная строка. всегда возвращает строку, которая заканчивается на "="
static public string GetRandomSalt(int saltLength)
{
byte[] saltByte = new byte[saltLength];
using (var random = new RNGCryptoServiceProvider())
{
random.GetBytes(saltByte);
}
return Convert.ToBase64String(saltByte);
}
так что если длина соли равна 8, она вернет некоторую случайную строку, но оканчивается на '=', как мне избежать этого? посмотрел на другое решение по переполнению стека, но все еще не могу это исправить
3 ответа
Это просто заполнение Base64, которое вы не можете избежать, смотрите здесь. Смотрите также спецификацию Base64.
Я рекомендую использовать соль в качестве массива байтов.
Знак равенства - это отступ. Это заполнение добавляется, когда число байтов, которые вы конвертируете в строку base64, не кратно трем.
В основном это так:
number of bytes % 3 == 0 -> no padding
number of bytes % 3 == 1 -> == padding
number of bytes % 3 == 2 -> = padding
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();
}
Проблема не связана с использованием RNGCryptoServiceProvider
, а скорее, что вы конвертируете результат в base-64.
Согласно документации:
Бесполезный символ "=" используется для конечного заполнения.
Итак, я могу придумать три варианта:
- Прекратите использовать форматирование base-64 (возможно, верните сами байты).
- Примите тот факт, что Base-64 использует
=
для набивки. - Передайте длину, которая не требует заполнения, например 9.
Пример для пункта 3:
Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})
производит
AQIDBAUGBwgJ