Я хотел бы хешировать пароли, используя PBKDF2 с перцем и солью в С#. Я немного новичок в криптографии, поэтому не стесняйтесь поправлять меня, если я ошибаюсь.
Я использую класс Rfc2898DeriveBytes, потому что (по словам других пользователей Stackoverflow) bcrypt и другие алгоритмы хеширования изначально не поддерживаются и не проверяются в C#, поэтому это может представлять угрозу безопасности. Цель этого поста не в том, чтобы начать дискуссию о том, какой алгоритм хеширования является лучшим. > Bcrypt в C# Stackoverflow
Моя цель: каждый пароль получит случайную соль и перец, пароль будет хеширован с определенным количеством итераций.
Мой вопрос: Плохо ли иметь больший размер ввода по сравнению с желаемым размером хэша, и правильно ли моя реализация?
- Пример: (PasswordInput (?) + Pepper (16 байт) + Salt (16 байт) > HashOutput (20 байт)
Мой код
public class GenerateHash
{
//Fields
private const int saltSize = 16;
private const int hashSize = 16;
private const int iterations = 10000;
private const string secretPepper = "Secret 16 Byte pepper.";
//Properties
private string inputId { get; set; }
//Methods
public byte[] GeneratePBKDF2String(string inputId, string secretPepper, int saltSize, int
hashSize, int iterations)
{
// Generate a random salt.
RNGCryptoServiceProvider cryptographicServiceProvider = new RNGCryptoServiceProvider();
byte[] salt = new byte[saltSize];
provider.GetBytes(salt);
// Generate a salted hash with pepper.
Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(inputId + secretPepper, salt, iterations);
return pbkdf2.GetBytes(hashSize);
}
}
Я понимаю это:
- Хэш необратим.
- Соль и перец добавляются для повышения безопасности и предотвращения атак радужного стола.
- Соль — это уникальная и случайная строка, она не обязательно должна быть секретной и может храниться вместе с хешем в базе данных.
- Перец не уникален и используется для каждого хэша. Это секрет, и он не хранится в базе данных.
- Для соли и перца следует использовать не менее 128 бит (16 байт > 16 символов).
- Для алгоритма должно быть использовано не менее 10 000 итераций.
Исследование: Microsoft Rfc2898DeriveBytes, Пример кода