在C#中生成哈希密码

时间:2016-07-08 20:46:00

标签: c# authentication mosquitto

我不知道这是否是正确的问题,但我遇到了MySql Backend的密码问题。我正在运行mosquitto 1.4.3代理,我让mosquitto-auth-plugin在同一台服务器上运行。但我想将auth-plugin移动到新服务器。所以我在C#中创建了一个管理程序来添加用户和访问控制,但我似乎无法获得密码的正确哈希码。

有没有人实现过这个或者是否有一些资源来创建正确的哈希?

我试过这个Hash It Right

private const int SaltByteLength = 12;
private const int DerivedKeyLength = 24;

public string CreatePasswordHash(string password)
{
    var salt = GenerateRandomSalt();
    var iterationCount = GetIterationCount();
    var hashValue = GenerateHashValue(password, salt, iterationCount);
    var iterationCountBtyeArr = BitConverter.GetBytes(iterationCount);
    var valueToSave = new byte[SaltByteLength + DerivedKeyLength + iterationCountBtyeArr.Length];
    Buffer.BlockCopy(salt, 0, valueToSave, 0, SaltByteLength);
    Buffer.BlockCopy(hashValue, 0, valueToSave, SaltByteLength, DerivedKeyLength);
    Buffer.BlockCopy(iterationCountBtyeArr, 0, valueToSave, salt.Length + hashValue.Length, iterationCountBtyeArr.Length);
    return Convert.ToBase64String(valueToSave);
}

private int GetIterationCount()
{
    return 901;
}

private static byte[] GenerateRandomSalt()
{
    var csprng = new RNGCryptoServiceProvider();
    var salt = new byte[SaltByteLength];
    csprng.GetBytes(salt);
    return salt;
}

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;
}

1 个答案:

答案 0 :(得分:1)

这会让你更容易吗?

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Class1
{
   static void Main(string[] args)
   {
      byte[] HashValue;

      string MessageString = "This is the original message!";

      //Create a new instance of the UnicodeEncoding class to 
      //convert the string into an array of Unicode bytes.
      UnicodeEncoding UE = new UnicodeEncoding();

      //Convert the string into an array of bytes.
     byte[] MessageBytes = UE.GetBytes(MessageString);

      //Create a new instance of the SHA1Managed class to create 
      //the hash value.
      SHA1Managed SHhash = new SHA1Managed();

      //Create the hash value from the array of bytes.
      HashValue = SHhash.ComputeHash(MessageBytes);

      //Display the hash value to the console. 
      foreach(byte b in HashValue)
      {
         Console.Write("{0} ", b);
      }
   }