сгенерировать пароль для auth-plug для mosquitto в С#

Я потратил весь день, пытаясь сделать пригодный для использования пароль 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, который использует это.


person Mark    schedule 01.07.2017    source источник
comment
Я не совсем понимаю ваш вопрос. У вас есть внешняя программа (не показана в вопросе), которая создает хэш PBKDF2 из пароля и сохраняет хэш в БД. Затем вы получаете пароль от пользователя и пытаетесь создать такой же хэш, как в базе данных (через код, который вы разместили выше). Смерть я правильно понимаю?   -  person mat    schedule 03.07.2017
comment
Да, плагин авторизации для брокера mosquitto mqtt имеет собственную функцию проверки пароля, которая должна использовать PBKDF2. У меня есть программа от них, которая создает хэш, который я вручную заношу в базу данных, и она работает. Однако, когда я пытаюсь продублировать процесс в С#, мой хеш неверен. Их программа написана на c, и мне нужно, чтобы мои пользователи могли создавать/изменять свой пароль в мобильном приложении, написанном на c#.   -  person Mark    schedule 03.07.2017
comment
Ссылка на подключаемый модуль, если это поможет.... github.com/jpmens/mosquitto-auth- штекер   -  person Mark    schedule 03.07.2017


Ответы (2)


Как вы уже указали в своем редактировании, проблема, по-видимому, заключается в разнице в хэш-функциях, используемых между плагином mosquitto (который, согласно исходному коду, поддерживает только SHA-256) и реализацией .NET (которая может выполнять только SHA- 1).

Более гибкая реализация PBKDF2 доступна в BouncyCastle, более легкую реализацию можно найти здесь. Если вас не устраивают эти два варианта, вы можете реализовать PBKDF2 самостоятельно, что на самом деле не сложно .

person mat    schedule 04.07.2017

Что ж, похоже, ответа на самом деле не было, и мало кто пытался. Я разобрался в проблеме, и, связавшись с автором mosquitto-auth-plug, он решил, что было бы хорошо, если бы мы добавили мое решение в его папку contrib в репозитории плагинов на github.

Так что теперь, если вам нужен алгоритм хэширования С# для mosquitto-auth-plug, просто перейдите в репозиторий в git здесь

https://github.com/jpmens/mosquitto-auth-plug/tree/master/contrib/C%23

и следуйте моим инструкциям --- Дайте мне знать, если у вас возникнут проблемы

person Mark    schedule 21.07.2017