【问题标题】:How to properly hash a password如何正确散列密码
【发布时间】:2019-04-16 18:04:38
【问题描述】:

我想重新创建 MyBB 哈希过程,以便我可以使用它的数据库在 3rd 方应用程序(用 C# 编写)上对用户进行身份验证。

MyBB 用途:

md5(md5($salt).password)

我的问题是我在 C# 上得到的结果与 MyBB 得到的结果完全不同。

我在 C# 上做了什么:

public string HashPass(string password, string salt)
{
    MD5 md5 = new MD5CryptoServiceProvider();

    byte[] saltHash =md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(salt));

    string passwordAndSalt = password + System.Text.Encoding.ASCII.GetString(saltHash);

    byte[] finalHash = md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(passwordAndSalt));

    string final = System.Text.Encoding.ASCII.GetString(finalHash);
    return final;
}

使用密码“Test123”和盐“0fYR6mEE”(从 MyBB db 收集)的函数得到的结果是:“??R?????s??”而实际结果应该类似于“VaHffsyzJeEa4dB3bbMWeUlJObAfN5I9rf1CuNRXCa6xPJTzXL”。

很可能我遗漏了一些明显的东西,对此感到抱歉。

【问题讨论】:

  • 你怎么知道MyBB使用ASCII来获取数据并得到结果?
  • MD5 是垃圾,不要使用它。查看其他算法,例如 bcrypt、scrypt 和/或 sha512crypt 以获取至少密码
  • @Çöđěxěŕ 该评论没有用,您是否阅读了问题? “我想重新创建 MyBB 散列过程,以便我可以使用它的数据库来验证用户”。不要假设 OP 可以使用他们想要的任何东西
  • @CamiloTerevinto 我同意说 OP 遇到的问题并没有什么用,那么这只是一个评论,而不是一个答案 :)
  • 纯猜测和我见过的一些例子。 @CamiloTerevinto

标签: c# md5


【解决方案1】:

这里有未知数。 MyBB 对密码字节使用哪种编码?它可以是 ASCII、ANSI 或 UTF8,也可以直接获取字符串字节,即无需编码。所以我会部分写成伪代码

byte[] passwordBytes = GetBytes(password); // Where you have to define GetBytes
byte[] saltBytes = System.Convert.FromBase64String(salt); // Assuming it is given as base64

// Merge the password bytes and the salt bytes
var mergedBytes = new byte[passwordBytes.Length + saltBytes.Length];
Array.Copy(passwordBytes, mergedBytes, passwordBytes.Length);
Array.Copy(saltBytes, 0, mergedBytes, passwordBytes.Length, saltBytes.Length);

var md5 = new MD5CryptoServiceProvider();
byte[] finalHash = md5.ComputeHash(mergedBytes);
string final = System.Convert.ToBase64String(finalHash);        

请注意,我正在合并密码字节和盐字节,而不是密码字符串和盐字符串。然后它只从这些合并的字节中获取一次 MD5。

但我不确定md5(md5($salt).password) 做了什么。 md5() 是否已经将哈希作为 base64 字符串返回?也许您必须将盐从 base64 转换为 bytes[],然后获取 MD% 哈希,将其转换为 base64 字符串,然后将其与密码字符串连接。然后从这个组合字符串中获取字节,再次进行哈希并将结果再次转换为 base64 字符串。

您必须深入挖掘 MyBB 的源代码才能确定。

【讨论】:

  • md5() 是 PHP 中使用的默认函数。 faqs.org/rfcs/rfc1321.html 我认为它使用了自定义编码系统,如果是这样,我知道如何在 c# 上实现它@Oliver Jacot-Descombes
  • md5($salt).password 似乎是一个串联(我不知道这种语言。它是 PHP 吗?)。但是什么的串联?如果md5() 产生字节并且password 是一个字符串,它会做什么?它是神奇地将字节转换为字符串还是将字符串转换为字节?字符串字符是 1 个字节还是 2 个字节。要回答所有这些问题,需要更好地了解original code
猜你喜欢
  • 2021-02-19
  • 2015-04-19
  • 2019-12-12
  • 2015-10-21
  • 2021-03-04
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多