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.

Согласно документации:

Бесполезный символ "=" используется для конечного заполнения.

Итак, я могу придумать три варианта:

  1. Прекратите использовать форматирование base-64 (возможно, верните сами байты).
  2. Примите тот факт, что Base-64 использует = для набивки.
  3. Передайте длину, которая не требует заполнения, например 9.

Пример для пункта 3:

Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9})

производит

AQIDBAUGBwgJ
Другие вопросы по тегам