如何让新用户密码更安全?
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 格式保存
我已经为我的管理面板创建了一个登录表单,我将创建的用户存储在 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 格式保存