我已经为我的管理面板创建了一个登录表单,我创建的用户存储在一个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的答案。
答案 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可以比手工编写更好地完成工作,这篇文章只是对背后发生的事情的解释。