MD5在SQL数据库和PHP脚本中的作用不同

Bor*_*sic 0 php mysql md5 cryptographic-hash-function

最近我创建了一个脚本来处理登录和注册我的游戏,使用http_get方法来更新统计数据.我成功地创造了一切,但是有一个问题.当用户注册时,它会插入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";
        }
Run Code Online (Sandbox Code Playgroud)

这是我检查密码的方式:

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

这是用户注册时数据库中的md5字符串:(未加密的字符串是:pocakaj123)

54e8850ba5eca655854ddf1b503943
Run Code Online (Sandbox Code Playgroud)

这是我生成的字符串echo md5($password).

54e8850ba5eca655854ddf1b50394348
Run Code Online (Sandbox Code Playgroud)

Pan*_*nda 6

这是由于数据库中字段的长度.你需要增加长度,以便整个字符串适合.

目前,它只接受30个字符,因此其余的被截断:

54e8850ba5eca655854ddf1b503943
Run Code Online (Sandbox Code Playgroud)

您需要将长度增加到至少32以适合整个字符串:

54e8850ba5eca655854ddf1b50394348
Run Code Online (Sandbox Code Playgroud)

注意:

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

md5()不安全的原因:

诸如MD5,SHA1和SHA256之类的散列算法设计得非常快速和高效.利用现代技术和计算机设备,为了确定原始输入,"蛮力"输出这些算法变得微不足道.

参考http://php.net/manual/en/faq.passwords.php.

  • 这是正确的答案.但是,值得注意的是,这不是*存储密码的安全方式.MD5坏了.OP应该使用bcrypt,而不是滚动他自己的散列解决方案. (3认同)