Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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 哈希密码注册/登录_Php_Salt_Sha256 - Fatal编程技术网

Php 哈希密码注册/登录

Php 哈希密码注册/登录,php,salt,sha256,Php,Salt,Sha256,我在谷歌上搜索如何正确地做到这一点,在如何做到这一点上有很多变化。所以我想到了这一点,并且不介意一些批评和更好实践的链接 //注册表单-用户提供用户名电子邮件密码文本// 所以我抓住了数据: $user = mysql_real_escape_string($_POST['user']); $pswd = mysql_real_escape_string($_POST['pass']); $salt = hash( 'sha256', microtime() . rand() ); $encry

我在谷歌上搜索如何正确地做到这一点,在如何做到这一点上有很多变化。所以我想到了这一点,并且不介意一些批评和更好实践的链接

//注册表单-用户提供用户名电子邮件密码文本//

所以我抓住了数据:

$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);
$salt = hash( 'sha256', microtime() . rand() );
$encrypt = hash( 'sha256', $pswd . $salt );
然后在数据库中插入用户|电子邮件|加密|密码| salt

//登录表单-用户提供用户名电子邮件密码文本//

因此,首先基于用户电子邮件,我获取加密的通行证和salt信息。那么

$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);

$encrypted_pass_fromDB = $var['encrypted_pass'];
$salt_fromDB = $var['salt'];

if (hash( 'sha256', $passwrd . $salt_fromDB) === $encrypted_pass_fromDB)
     {
      echo "GOT IT!";
     }
我读过bcrypt是一个更好的选择,但现在我想更好地理解SALT方法。另外,当我使用$options=['cost'=>11,];我得到一个错误解析错误:语法错误,意外的“[”,但我想这是一个单独的问题


非常感谢您的评论!谢谢!

在向哈希中添加salt时,您唯一可以避免的事情是使用大型预计算哈希表(称为彩虹表)。这些问题在相当长的一段时间内都不是一个大问题,但因为:

包含扩展字符集的Rainbow表非常庞大,有些需要16GB以上的RAM进行搜索。 跨多台计算机的并行蛮力破解,或卸载到AWS等云服务,速度更快、成本更低,而且添加简单的盐几乎无关紧要。 更好的算法会对密码进行数千次哈希运算,并以加密正确的方式应用给定的salt,使其更难破解。然而,它们基于的哈希算法(如SHA和MD5)设计得又小又快,粗暴地使用它们需要大量的CPU时间,这既便宜又容易破解利兹

Bcrypt则不同。它使用的是Blowfish算法,需要相对大量的RAM,这非常昂贵,因此难以并行化。这就是为什么每个人都强烈推荐它的原因


TL;DR Hashing比纯文本好,salted比unsalted好,bcrypt比其他任何东西都好,所以frickin可以使用它。

您应该使用内置的crypt函数:

您有两个选择:

让PHP Crypt生成salt

自己制作盐

验证它很容易:

if ( $encrypted_pass_fromDB_with_salt === crypt( $passwrd, $encrypted_pass_fromDB_with_salt ) ) echo "ok";

PHP现在提供了一种生成安全密码哈希的简单方法,我们应该使用它,看看函数


当然,了解salt的工作原理以及正确处理它的困难程度是很好的,所以请尝试一下,但要在您的生活系统中使用上面的函数。

作为第一步,不要再使用不推荐的MySQL扩展!使用预先准备好的语句或PDO切换到MySQLi。我很乐意这样做,但不知什么原因,PDO php扩展没有加载,所以我不得不暂时使用mysql。但你绝对正确。也可以看看Openwall的PHPass。它的便携性和抗用户密码常见攻击的能力。编写框架SolarDesigner的人与编写框架SolarDesigner的人是同一个家伙,他在该框架中担任法官。因此,他对攻击passw有一两点了解如果crypt$pass,$encrypt==$encryptedPassInDB{}???@ipixel在我的答案中添加了验证,那么也可以使用.Hmmm和我通过这样做进行验证
$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);

//These are the settings for the salt (Separated so you can understand it)
$algorithm = "2a";
$length = "12";

//Start the salt by specifying the algorithm and length
$salt = "$" . $algorithm . "$" . $length . "$";

//Add on random salt and make base64 adjusted for bcrypt's version
$salt .= substr( str_replace( "+", ".", base64_encode( mcrypt_create_iv( 128, MCRYPT_DEV_URANDOM ) ) ), 0, 22 );

//Encrypt with your generated salt
$encrypt = crypt( $pswd, $salt );
if ( $encrypted_pass_fromDB_with_salt === crypt( $passwrd, $encrypted_pass_fromDB_with_salt ) ) echo "ok";
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);