2016-04-23 87 views
1

最近我创建了一个处理我的游戏的登录和注册的脚本,它使用http_get方法更新统计信息。我已经成功地创造了一切,但有一个问题。当用户注册时,它会插入不同的php脚本生成的md5字符串,因此我无法比较密码。在SQL数据库和PHP脚本中作用不同的MD5

这是我插入的MD5字符串转换成数据库的方式:

$pw = md5($password); 
    $insert = mysqli_query($connect, "INSERT INTO Accounts (username, password, email,reg_ip, wins, looses, experience) VALUES ('$username', '$pw', '$email', '$reg_ip', '0','0', '0')"); 
    if($insert) { 
      echo "account successfully created"; 

     } 
     else { 
      echo "error"; 
     } 

这是我检查密码方式:

if($p['password'] == md5($password)) { 
       echo "login was successful!"; 
      } 
      else { 
       echo "incorrect password"; 
      } 

这是MD5字符串,它是在数据库当用户注册时:(未加密的字符串是:pocakaj123)

54e8850ba5eca655854ddf1b503943 

这是生成的字符串当我回声MD5($密码)。

54e8850ba5eca655854ddf1b50394348 

在此先感谢,所有的答案都非常感谢!

+1

为什么其中一个只有30个字符? MD5的十六进制是32个字符。 –

+2

你不应该使用'md5'来存储你的密码,所以这个问题是无关紧要的。 –

+0

请参阅:[如何安全存储用户的密码](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016)。 –

回答

6

这是由于您的数据库中的字段长度所致。您需要增加长度,以便整个字符串可以适合。

目前,它仅接受30个字符,因此剩下的被截断:

54e8850ba5eca655854ddf1b503943 

你需要增加长度,至少32个,以适应整个字符串:

54e8850ba5eca655854ddf1b50394348 

备注:

md5()不是一个安全的哈希密码方式,更好的方法是bcrypt()或者改为使用PHP的密码哈希函数,password_hash()

原因是md5()不安全:

散列算法,如MD5,SHA1和SHA256都设计得非常快速,高效。使用现代技术和计算机设备,为了确定原始输入,将这些算法的输出“暴力”变得微不足道。

引用自http://php.net/manual/en/faq.passwords.php

+3

这是正确的答案。但是,还需要注意的是,这不是一种安全的存储密码的方式。 MD5坏了。 OP应该使用bcrypt,而不是滚动他自己的散列解决方案。 –

+0

@EdCottrell True,将更新帖子添加此提示,谢谢指出! – Panda

+0

@BorutMatjasic也许接受这个答案,如果它帮助你?谢谢! – Panda