我花了一整天时间尝试为mosquitto-auth-plug创建一个可用的pbkdf2密码。该程序将其设置为应该存储在mysql数据库中的方式。我有一个由auth-plug附带的程序生成的密码哈希,而mosquitto喜欢它。我无法在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;
}
--- ----- EDIT
Rfc2898DeriveBytes州 - 通过使用基于HMACSHA1的伪随机数生成器实现基于密码的密钥派生功能PBKDF2。
程序/ auth-plug似乎正在使用sha256是否有使用它的c#PBKDF2。
答案 0 :(得分:0)
正如您在编辑中已经说过的那样,问题似乎是mosquitto插件(根据源代码仅支持SHA-256)和.NET实现(只能执行)之间使用的散列函数的不同之处做SHA-1)。
BouncyCastle中提供了更灵活的PBKDF2实现,可以找到更轻量级的实现here。如果你对这两个人不满意,你可以选择自己实施PBKDF2,is not really hard。
答案 1 :(得分:0)
看来真的没有答案,也没有多少人尝试过。我想出了问题,在联系了mosquitto-auth-plug作者之后,他觉得将我的解决方案添加到插件github repo上的contrib文件夹会很好。
所以现在如果你需要一个针对mosquitto-auth-plug的c#散列算法,那就去git这里的repo吧
https://github.com/jpmens/mosquitto-auth-plug/tree/master/contrib/C%23
并按照我的指示---如果您有任何问题,请告诉我