【问题标题】:I'm having trouble retrieving a salt from a mysql database using mysql.data. (c#)我在使用 mysql.data 从 mysql 数据库中检索盐时遇到问题。 (C#)
【发布时间】:2015-08-17 19:40:23
【问题描述】:

我正在创建一个聊天程序,我正在使用 mysql 数据库来处理所有用户的登录信息。登录相当简单。数据库中的密码是 SHA256 散列,末尾带有盐。我需要从数据库中检索盐并使用输入的密码对其进行哈希处理,以查看它是否与数据库中的密码匹配,如果匹配,则用户将登录。但是我在检索盐时遇到了麻烦。我试图检索的盐的一个例子是:

q'³SÁ(–¤Lí~ÕEÁÞf-]'›š²ìs®§ ”

。我能成功检索的是:

q'³SÁ(–¤Lí~ÕEÁ

这是我检索盐的代码:

private void GetSalt()
        {
            try
            {
                MySqlConnection conn = new MySqlConnection(GlobalData.MySQLConnectionString);
                MySqlCommand saltQuery = conn.CreateCommand();
                saltQuery.CommandText = "SELECT salt FROM users WHERE email = @email";
                saltQuery.Parameters.AddWithValue("@email", this._enteredEmail);
                conn.Open();
                MySqlDataReader saltReader = saltQuery.ExecuteReader();
                while (saltReader.Read())
                {
                    this._salt = saltReader.GetString("salt");
                }
            }
            catch (MySqlException ex)
            {
                throw ex;
            }
        }

知道为什么我不能找回完整的盐吗?

P.S.-> 所有用户信息均通过网站创建并使用 PHP 进行哈希处理。我不知道这是否需要信息。

【问题讨论】:

  • 如果您将盐存储为字符串(不正确),则可能它包含使事情变得混乱的空值或 EOF 字符。您可能需要对其进行 ASCII 编码和解码。您将其存储为什么?
  • @SteveWellens 我将其存储为 varchar
  • 完整的盐是否存储在数据库中?如果您查看 PHP myAdmin 或 MySQL Workbench 中的条目,那里有完整的盐吗? varchar(n) 中的 n 是否足够大以容纳生成的盐?
  • @JRLambert 是的,完整的盐在数据库中。每个盐有可能是最多 32 个字符,我在数据库中也有这个设置

标签: c# mysql salt


【解决方案1】:

我建议使用BCrypt.Net 库,它不仅为密码散列提供了适当的算法,而且还处理了安全盐的生成。因为盐会包含在生成的哈希值中,所以数据库中不需要单独的字段。

MD5、SHA-1 甚至 SHA-256 等快速哈希算法不是对密码进行哈希处理的好选择,因为它们太快了,因此很容易被暴力破解。相反,应该使用具有成本因素的慢速密钥派生函数,例如 BCrypt 或 PBKDF2。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
string hashToStoreInDb = BCrypt.HashPassword(password);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from existingHashFromDb.
bool isPasswordCorrect = BCrypt.Verify(password, existingHashFromDb);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多