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

时间:2015-04-15 09:59:57

标签: php mysql database security md5

我已经为我的管理面板创建了一个登录表单,我创建的用户存储在一个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,我只是不确定如何将它添加到此代码中?

EDIT ::

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

如果md5不像我看到的其他选项那么安全,可以用来代替md5吗?

EDIT ::

我现在意识到md5并不像最初想象的那样安全。有关此问题的最佳解决方案,请参阅@ kyborek的答案。

4 个答案:

答案 0 :(得分:0)

在php中有许多密码哈希教程,你需要做的就是搜索它们。

例如,您可以在PHP中使用内置函数: http://php.net/manual/en/function.password-hash.php 这是php hashing&amp;的摘要页面。验证功能: http://php.net/manual/en/faq.passwords.php

如果您想让密码安全(而不仅仅是不可读),您至少应该阅读这个答案https://stackoverflow.com/a/401684/1276062

如果你真的想使用MD5,你也可以将密码保存在纯文本中。

答案 1 :(得分:0)

在您的Db中保存密码时使用此功能 例如:

$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格式保存

答案 2 :(得分:-1)

使用密码的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流程。

答案 3 :(得分:-1)

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

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

举个简单的例子:

    // 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");

这种情况非常简单,您应该在数据库中插入时将几个方法和/或控制结构应用于哈希。

如果您熟悉Symfony2,我建议您查看 FosUserBundle 的核心,因为它说明了您可以对哈希做的操作,如循环和其他事情。

编辑:顺便说一句,Md5并不安全。

Edit2:现有的API可以比手工编写更好地完成工作,这篇文章只是对背后发生的事情的解释。