Я потратил весь день, пытаясь сделать пригодный для использования пароль pbkdf2 для mosquitto-auth-plug. Эта программа настраивает его именно так, как он должен храниться в базе данных mysql. У меня есть хэш пароля, сгенерированный программой, которая поставляется с auth-plug, и mosquitto это нравится. Я просто не могу воспроизвести это на С#, если кто-нибудь может помочь, дайте мне знать.
public string CreatePasswordHash(string password)
{
var salt = GenerateRandomSalt();
var iterationCount = GetIterationCount();
var hashValue = GenerateHashValue(password, salt, iterationCount);
string result = "PBKDF2$sha256$" + iterationCount + "$" + Convert.ToBase64String(salt) + "$" + Convert.ToBase64String(hashValue);
return result;
}
private int GetIterationCount()
{
return 901;
}
private static byte[] GenerateRandomSalt()
{
var csprng = new RNGCryptoServiceProvider();
var salt = new byte[SaltByteLength];
csprng.GetBytes(salt);
return salt;
//return GetLetter();
}
private static byte[] GenerateHashValue(string password, byte[] salt, int iterationCount)
{
byte[] hashValue;
var valueToHash = string.IsNullOrEmpty(password) ? string.Empty : password;
using (var pbkdf2 = new Rfc2898DeriveBytes(valueToHash, salt, iterationCount))
{
hashValue = pbkdf2.GetBytes(DerivedKeyLength);
}
return hashValue;
}
---РЕДАКТИРОВАТЬ-----
Состояния Rfc2898DeriveBytes — реализует функцию получения ключа на основе пароля, PBKDF2, с помощью генератора псевдослучайных чисел на основе HMACSHA1.
Похоже, что программа / auth-plug использует sha256, есть ли С# PBKDF2, который использует это.