Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在mysql中创建和存储md5密码_Php_Mysql_Password Storage - Fatal编程技术网

Php 如何在mysql中创建和存储md5密码

Php 如何在mysql中创建和存储md5密码,php,mysql,password-storage,Php,Mysql,Password Storage,这可能是一个非常新的问题,但我一直在阅读,在理解密码的创建和存储方面发现了一些困难。据我所知,md5/哈希密码是将它们存储在数据库中的最佳方法。但是,我首先应该如何创建这些密码 假设我有一个用户bob和密码bob123的登录页面 -我该怎么办 1.首先将bobs密码输入数据库(哈希) 2.如何检索和确认哈希密码 谢谢您必须根据hased密码进行推理: 将密码存储为md5('bob123')当bob注册到你的应用程序时 $query = "INSERT INTO users (username,p

这可能是一个非常新的问题,但我一直在阅读,在理解密码的创建和存储方面发现了一些困难。据我所知,md5/哈希密码是将它们存储在数据库中的最佳方法。但是,我首先应该如何创建这些密码

假设我有一个用户bob和密码bob123的登录页面 -我该怎么办 1.首先将bobs密码输入数据库(哈希) 2.如何检索和确认哈希密码


谢谢

您必须根据hased密码进行推理:

将密码存储为
md5('bob123')当bob注册到你的应用程序时

$query = "INSERT INTO users (username,password) VALUES('bob','".md5('bob123')."');
然后,当bob登录时:

$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';

显然,用户名和密码使用变量,这些查询由php生成,然后您可以在mysql上执行它们

$password=md5($password)


$password
将是
$\u POST['password']
或PHP有一个称为md5;-)的方法的任何东西只需$password=md5($passToEncrypt)

如果您在SQL中搜索,您也可以使用MySQL方法MD5()

或 从ser中选择*其中Password=MD5(“.$Password.”)

要插入它,你可以用同样的方法。

插入:

INSERT INTO ... VALUES ('bob', MD5('bobspassword'));
检索:

SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');

你是如何直接在查询中完成的。但是,如果您的MySQL已启用查询日志记录,则密码的明文将写入此日志。所以您希望在脚本中执行MD5转换,然后将结果哈希插入查询。

为什么不使用MySQL内置密码哈希程序:

为了进行比较,您可以这样做:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')
$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);

$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";

# if nonzero query return then successful login
 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );
从PassworTable中选择id,其中Userid=''和Password=Password('')

如果它返回一个值,那么用户是正确的。

编辑2017/11/09:请务必查看O Jones的答案

首先,MD5并不是最好的散列方法,您可以尝试使用sha256或sha512

也就是说,让我们使用
hash('sha256')
而不是
md5()
来表示流程的哈希部分

当您第一次创建用户名和密码时,您将在原始密码中添加一些盐(在每个密码中添加一些随机的额外字符,以使其更长/更强)

从“创建用户”表单中可能会出现如下情况:

$escapedName = mysql_real_escape_string($_POST['name']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST['password']);

# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "insert into user (name, password, salt) values ('$escapedName', '$hashedPW', '$salt'); ";
然后在登录时,它将显示如下:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')
$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);

$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";

# if nonzero query return then successful login
 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );

只需通过以下行获取哈希并将其存储到数据库中:

$encryptedValue = md5("YOUR STRING");

请不要使用MD5进行密码哈希。这样的密码可以在几毫秒内破解。你肯定会被网络罪犯打败

PHP提供了一种基于可靠的随机salt和多轮Rijndael/AES加密的加密方法

当用户首次提供密码时,可以按如下方式对其进行散列:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')
$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);

$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";

# if nonzero query return then successful login
 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );
然后,在MySQL的
varchar(255)
列中存储
$hashed\u password
。稍后,当用户想要登录时,您可以从MySQL检索哈希密码,并将其与用户提供的登录密码进行比较

 $pass = 'whatever the user typed in';
 $hashed_password = 'what you retrieved from MySQL for this user';
 if ( password_verify ( $pass , $hashed_password )) {
    /* future proof the password */
    if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) {
       /* recreate the hash */
       $rehashed_password = password_hash($pass, PASSWORD_DEFAULT );
       /* store the rehashed password in MySQL */
     }
     /* password verified, let the user in */
 }
 else {
     /* password not verified, tell the intruder to get lost */
 }
这种未来验证是如何工作的?PHP的未来版本将适应更快、更容易破解的加密。如果有必要重新设置密码以使其更难破解,该函数的未来实现将检测到这一点


不要重新发明爆胎。使用经过专业设计和审查的开放源代码进行安全保护。

为了进一步提高安全性,您可以使用md5加密和两个不同的salt字符串,一个在php文件中定义的静态salt,然后为每个密码记录随机生成一个唯一salt

以下是如何生成salt、md5字符串和存储:

    $unique_salt_string = hash('md5', microtime()); 
    $password = hash('md5', $_POST['password'].'static_salt'.$unique_salt_string);
    $query = "INSERT INTO users (username,password,salt) VALUES('bob','".$password."', '".$unique_salt_string."');
现在您有了一个静态salt,它对所有密码都有效,存储在.php文件中。然后,在注册执行时,为该特定密码生成唯一的哈希

这一切的结果是:两个拼写完全相同的密码将有两个不同的散列。唯一的散列与当前id一起存储在数据库中。如果有人抓取数据库,他们将拥有每个特定密码的唯一salt。但他们没有的是你的静态盐,这让每一个“黑客”都很难对付

这是在login.php上检查密码有效性的方法,例如:

     $user = //username input;
     $db_query = mysql_query("SELECT salt FROM users WHERE username='$user'");
     while($salt = mysql_fetch_array($db_query)) {
            $password = hash('md5',$_POST['userpassword'].'static_salt'.$salt[salt]);
}

这种方法是非常强大和安全的。如果您想使用sha512加密,只需将其放入哈希函数中,而不是上面代码中的md5。

注意-您不应该对每个要哈希的密码使用相同的salt。最好对每个密码使用一个唯一的(随机的)salt为什么在对密码进行散列之前要对其进行转义?我认为您应该对要注入数据库的哈希密码进行转义。您假设哈希返回二进制输出。可以,但必须将其作为第三个参数传递为true,请参见。因为第三个参数默认为false,所以散列只返回安全的值。作为一种最佳实践,我逃避了来自表单的大部分内容。我们可能可以在这里避免它,但总是这样做,然后检查没有它的地方对我来说更安全。我知道这个线程非常旧,但是我很好奇如何准确地编写salt解析查询…请参阅手册,了解如何执行查询字符串,然后解析结果:。其他数据库也是如此。最具可读性的是fetch#u assoc变体,如该链接中的示例2。然后,您可以通过如下方式获取salt字符串值:$row=mysql\u fetch\u assoc($result)$salt=$row['salt'];这既不是加密值,也不应使用MD5对密码进行散列。该函数就是一种方法。您应该向该函数添加一个salt,以使破解表中的所有密码变得更加困难:
$salt=“1qTR3”。。。md5('bob123.$salt).
。否则-爱你的解决方案!MD5-sh