【发布时间】: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 个字符,我在数据库中也有这个设置