如何让新用户密码更安全?

how can I make new users password more secure?

我已经为我的管理面板创建了一个登录表单,我将创建的用户存储在 mysql 数据库中,但是所有密码都以纯文本形式显示。我知道我需要使用 md5 对密码进行编码并使它们更安全我只是不确定如何执行此操作...

我的代码如下:

<?php
    session_start();
    include("../config.php");

    $username   =   trim($_GET['username']);
    $password   =   trim($_GET['password']);
    $cpassword  =   trim($_GET['cpassword']);
    $name   =   trim($_GET['name']);
    $email  =   trim($_GET['email']);

    //Server side validation

    //check if all fields are enter or not
    if($username == '' || $password == '' || $name =='' || $email =='')
    {
            $output['error']    =   'error';
            $output['msg']      =   'All fields are mandatory';         
    }

    //Check password and confirm password match or not
    else if($cpassword != $password)
    {
            $output['error']    =   'error';
            $output['msg']      =   'Password and confirm password do not Match';

    }
    else if(!filter_var($email, FILTER_VALIDATE_EMAIL))
    {
            $output['error']    =   'error';            
            $output['msg']      =   'Enter correct Email ID';

    }
    // Insert the data into the database
    else{

            // SELECT MATCH FROM THE DATABASE
            $queryMatch =   "SELECT * FROM `users` where username=?";           
            $statementMatch =   $db->prepare($queryMatch);
            $statementMatch->execute(array($username));

            if($statementMatch->rowCount() > 0) {
                $output['error']    =   'error';
                $output['msg']      =   'Username Already exists.Try another username.';
            }else{  
                $query  =   "INSERT INTO `users` SET username=? , password =? , name = ? ,email=?";
                $parameters =   array($username,$password,$name,$email);
                $statement  =   $db->prepare($query);

                $statement->execute($parameters);

                $output['error']    =   'success';
                $output['msg']      =   'Registered Successfully.Redirecting to Login Page..';
            }

    }   
    echo json_encode($output);  
?>

如果有人能帮助我,那就太好了,正如我所说,我知道我在某些时候需要使用 md5,我只是不确定如何将它添加到这段代码中?

编辑::

我想知道如何将 md5 添加到此代码中,以便使用 md5 对密码进行编码并以安全的方式保存。 但我也想知道如何使密码更安全。目前,新用户的密码必须包含 8 个或更多字符,并包含一个数字和一个符号,但理想情况下,我可以用一种方法让他们生成 100/100 个安全密码。

如果 md5 不像看起来那么安全,我还有哪些其他选项可以用来代替 md5?

编辑::

我现在意识到 md5 并不像最初想象的那么安全。请参考@kyborek 的回答以获得此问题的最佳解决方案。

会更容易使用MySQL密码的默认功能:

INSERT INTO `users` SET username=? , password =Password('mypassword') , name = ? ,email=?

验证:

Select * from users where username = ? and password = Password('mypassword')

批量隐藏所有密码:

Update users set password = Password(password)

这将更新数据库中的所有密码,但在此之前请修改您的 Login 流程。

php 中有许多密码散列教程,您只需搜索它们即可。

例如,您可以在 PHP 中使用内置函数: http://php.net/manual/en/function.password-hash.php 这是 php 散列和验证函数的摘要页面: http://php.net/manual/en/faq.passwords.php

如果你想让密码安全(而不仅仅是不可读)你至少应该阅读这个答案

如果你真的想使用 MD5,你也可以将密码保持为明文形式。

当您将用户及其密码插入数据库时​​,您将使用来自用户的不同计算数据(我在示例中采用帐户创建日期和用户名)对其应用哈希算法。

在您的用户进行身份验证时,您将哈希算法应用于他输入的凭据。

举个简单的例子:

    // Database INSERTION TIME
    $username = "Spartan1337";
    $password = "Lanaya_Best_Pick";
    $created_day = "42";

    $hash = md5($username . $created_day . $password);

    // Credential inputs recuperation, Changed var names to insist on input
    $username_input = "Spartan1337";
    $password_input = "Lanaya_Best_Pick";
    function getUserCreatedDay($user) { return ("42"); }

    // Authentification test
    if (md5($username_input . getUserCreatedDay($username_input) . $password_input) == $hash)
        echo ("Success");
    else
        echo ("Fail");

这种情况非常简单,您应该在插入数据库时​​对哈希应用几种方法 and/or 控制结构。

如果您熟悉 Symfony2,我建议您看一下 FosUserBundle 的核心,因为它说明了您可以对哈希执行的操作,如循环和其他操作东西.

编辑:顺便说一下,Md5 不是那么安全。

编辑 2:现有的 API 会比您手工编写的更好,这 post 只是对后面发生的事情的解释。

只需在将密码保存在数据库中时使用它 例如:

$name = $_POST['username'];
$address = $_POST['address'];
$email = $_POST['email'];
$username = $_POST['username'];
$password= $_POST['password'];
$password = md5($password);

insert into users ('name','address','email','username','password') values ('$name','$address','$email','$username','$password');

这样您的密码将以 md5 格式保存