Cryptography 在c中为MOSQUITO生成身份验证插件的密码#

Cryptography 在c中为MOSQUITO生成身份验证插件的密码#,cryptography,mqtt,mosquitto,Cryptography,Mqtt,Mosquitto,我花了一整天的时间试图为mosquitto身份验证插件创建一个可用的pbkdf2密码。这个程序完全按照mysql数据库中的存储方式设置它。我有一个由auth plug附带的程序生成的密码散列,mosquito很喜欢它。我只是无法在c#中复制它,如果有人能帮忙,请告诉我 public string CreatePasswordHash(string password) { var salt = GenerateRandomSalt(); var i

我花了一整天的时间试图为mosquitto身份验证插件创建一个可用的pbkdf2密码。这个程序完全按照mysql数据库中的存储方式设置它。我有一个由auth plug附带的程序生成的密码散列,mosquito很喜欢它。我只是无法在c#中复制它,如果有人能帮忙,请告诉我

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状态-- 通过使用基于HMACSHA1的psuedo随机数生成器实现基于密码的密钥派生功能PBKDF2


程序/身份验证插件似乎正在使用sha256。是否有一个c#PBKDF2使用它。

正如您在编辑中所述,问题似乎在于mosquitto插件(根据源代码,它只支持SHA-256)和.NET实现(它只能执行SHA-1)之间使用的哈希函数不同


中提供了更灵活的PBKDF2实现,可以找到更轻量级的实现。如果您对这两个方面不满意,您可以选择自己实施PBKDF2,这是。

看来确实没有答案,也没有多少人尝试过。我发现了这个问题,在联系mosquitto auth插件作者后,他觉得将我的解决方案添加到插件github repo上的contrib文件夹中对我们来说是件好事

所以现在如果你需要一个c#散列算法来实现MOSQUITO身份验证插件,只需在这里转到git中的repo


按照我的指示去做——如果你有任何问题请告诉我

我不完全理解你的问题。您确实有一个外部程序(问题中未显示),它根据密码创建PBKDF2哈希并将哈希存储在db中。然后从用户处获得密码,并尝试创建与数据库中相同的哈希(通过上面发布的代码)。是的,mosquitto mqtt broker的auth插件有自己的密码检查功能,应该使用PBKDF2。我有一个来自他们的程序,它创建了一个散列,我手动将其放入数据库中,它可以工作。但是,当我试图在c#中复制该过程时,我的哈希值不正确。他们的程序是用c语言编写的,我需要我的用户能够在用c语言编写的移动应用程序中创建/更改他们的密码,如果有帮助,请链接到插件。。。。