3

我有一个存储密码的数据库字段,如下所示:

TeacherPassword

j.lu01
pesci02
cricket01

现在我有一个文本框,用户在其中输入密码,如果它与其中一行匹配,则导航到下一页。下面是它检查密码的代码。

 $teacherpassword = (isset($_POST['teacherpassword'])) ? $_POST['teacherpassword'] : '';

  if (isset($_POST['submit'])) {

    // don't use $mysqli->prepare here
    $query = "SELECT * FROM Teacher WHERE TeacherPassword = ? LIMIT 1";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("s",$teacherpassword);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherPassword);

但是我所做的是我已经更新了密码字段,以便该字段不会将密码显示为字符串,而是显示为一串字符,以便他们的密码是安全的。以下是我所做的更新:

UPDATE Teacher
SET TeacherPassword = Password(TeacherPassword);

这导致密码字段现在看起来像这样:

TeacherPassword

    *6FF132E0666AC8462BC
    *FCF5F8CE105D0748315
    *FD4FA4B60EEF1E24050

所以我的问题是,在我的 MYsqli 代码中,如何让在文本框中输入的字符串密码j.lu01与其在数据库行中的哈希密码相匹配*6FF132E0666AC8462BC

4

4 回答 4

6

如果是这种情况,那么您需要先hash输入密码,然后再在数据库中搜索密码。顺便说一下,我尝试在 sqlfiddle 上运行并生成不同的哈希值

Password('j.lu01') => *7A48257211A5C6BF45C30374789E9027726D829D
Password('jlu_01') => *FCF5F8CE105D0748315591596E8A4F87A2E12B1A

-- your password field is truncated that's why it can't find the match also
-- alter TeacherPassword field and change it's length to 42

你能检查一下你的TeacherPassword字段的长度吗?

SQLFiddle

于 2012-08-02T22:55:26.940 回答
1

只需将查询更改为:

SELECT * FROM Teacher WHERE TeacherPassword = Password(?) LIMIT 1
于 2012-08-02T21:52:34.653 回答
1

您的密码字段限制为 20 个字符,因此您的哈希密码已被修剪为该长度,请尝试:

SELECT * FROM Teacher WHERE TeacherPassword = LEFT(Password(?),20)

但 :

  1. PASSWORD 是 mysql 内部使用的,你应该用 SHA1 代替
  2. 您应该真正调整密码字段的大小(如果您仍然有非编码值)。
  3. 您应该考虑在对密码进行哈希处理时使用在密码前附加一个随机字符串(例如 6 个字符)对密码进行“加盐”,以便 2 个相同的密码得到不同的编码。

稍后,您需要向salt表中添加一列并用一些随机字符串填充它。

然后你可以使用编码:

UPDATE Teacher SET TeacherPassword = SHA1(salt @password)

SELECT * FROM Teacher WHERE TeacherPassword = SHA1(salt @password)

一个非常好的最终解决方案可能是:

ALTER TABLE Teacher CHANGE TeacherPassword TeacherPasswordOld VarChar(20)
ALTER TABLE Teacher ADD TeacherPassword VarChar(40)
ALTER TABLE Teacher ADD Salt VarChar(40)

对于 udpate 传递 2 个值:@salt 和 @password

Update Teacher SET Salt=@salt, Password=SHA1(Salt @password)

可以像这样在php中生成盐的地方:

$salt = ""; 
for ($i = 0; $i < 40; $i++) { 
   $salt .= substr(
     "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 
     mt_rand(0, 63), 
     1); 
}

为了检查密码,您将使用

SELECT * from Teacher 
-- if no "new" password, check the old one
WHERE TeacherPassword is null and TeacherPasswordOld=LEFT(Password(@password),20)) 
-- else check the new pass
   OR TeacherPassword = Sha1(salt @password)

盐发生器在这里

于 2012-08-07T16:35:03.837 回答
0

您可以编写如下查询:-

SELECT * FROM Teacher_Table WHERE HEX(t_password)=HEX('Your_Password') LIMIT 1;

用于HEX(), MD5()更好的安全性。此查询在 MySQL 上进行了测试。

不使用上述功能:-

 SELECT * FROM Teacher_Table WHERE t_password='Your_Password' LIMIT 1;

您也可以PASSWORD()按照上述答案中的说明使用。检索时还有许多其他方法可以使您的查询安全。

建议使用上述功能以避免黑客攻击。

于 2012-08-06T12:43:29.540 回答