Хэш пароля через Rfc2898DeriveBytes - что передать getBytes

Я использую Rfc2898DeriveBytes для хэширования паролей.

Однако я не уверен относительно того, что переходить к методу GetBytes, который ожидает int.

Какую ценность я должен передать этому и почему?

   Rfc2898DeriveBytes hasher = new Rfc2898DeriveBytes(password, System.Text.Encoding.Default.GetBytes(salt), PasswordHasher.Iterations);
      return Convert.ToBase64String(hasher.GetBytes(100));

1 ответ

Решение

Как описано на http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.getbytes.aspx, аргумент GetBytes - это количество байтов, которое вы хотите, чтобы метод GetBytes сгенерировал для вас. Если вам нужно 5 байтов, пропустите 5. Если вы хотите 500, пропустите 500. Сколько байтов вы запрашиваете, обычно зависит от того, сколько вам нужно для предполагаемого использования ключа (или другого криптографического ввода), который вы генерируете.

Чтобы лучше понять вывод, попробуйте запустить следующее приложение командной строки:

internal static class Program
{
    private static void Main()
    {
        var deriver = new Rfc2898DeriveBytes("apples and oranges", 100, 20);
        Program.WriteArray(deriver, 5);
        Program.WriteArray(deriver, 10);
        Program.WriteArray(deriver, 20);

        Console.ReadLine();
    }

    private static void WriteArray(Rfc2898DeriveBytes source, int count)
    {
        source.Reset();
        Console.WriteLine(string.Join(" ", source.GetBytes(count).Select(b => b.ToString())));
    }
}

Вывод должен выглядеть так:

208 194 113 91 125
208 194 113 91 125 157 138 234 20 151
208 194 113 91 125 157 138 234 20 151 159 151 23 94 11 210 38 101 186 143

По сути, вы получаете согласованный список байтов (на основе пароля, соли и итераций) любой длины, которую вы выберете. Вы можете в любой момент восстановить один и тот же список байтов из одних и тех же входов.

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