Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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中使用Bcrypt通过注册和登录过程对密码进行加密_Php_Mysql_Bcrypt - Fatal编程技术网

如何在php中使用Bcrypt通过注册和登录过程对密码进行加密

如何在php中使用Bcrypt通过注册和登录过程对密码进行加密,php,mysql,bcrypt,Php,Mysql,Bcrypt,我有一个注册页面,允许用户输入信息,其中一个是密码,因此必须对其进行加密或散列,以便使用Bcrypt并在注册中工作 但是当涉及到登录时,我不知道在哪里以及如何使用它 有人能帮我吗 register.php: require_once('Bcrypt.php'); $bcrypt = new Bcrypt(15); $hash = $bcrypt->hash('$pass1'); //********Insert all the members's input to the datab

我有一个注册页面,允许用户输入信息,其中一个是密码,因此必须对其进行加密或散列,以便使用Bcrypt并在注册中工作

但是当涉及到登录时,我不知道在哪里以及如何使用它
有人能帮我吗

register.php:

require_once('Bcrypt.php'); 

$bcrypt = new Bcrypt(15);
$hash = $bcrypt->hash('$pass1');

//********Insert all the members's input to the database**************//
$query = mysql_query("INSERT INTO members
                      (user_name, first_name, last_name,
                       governorate, district, village,
                       birth_date, email_address,
                       specialization, password, registered_date)
                      VALUES
                      ('$username', '$firstname', '$lastname',
                       '$governorate', '$district', '$village',
                       '$bdate', '$email', '$specialization',
                       ' $hash',  now())")
                      or die("could not insert data");
login.php

require_once('Bcrypt.php');

$bcrypt = new Bcrypt(15);
$hash = $bcrypt->hash('$pass');
$isGood = $bcrypt->verify('$pass', $hash);

$sql=mysql_query("SELECT user_id, email_address,
                         first_name, user_name
                  FROM members
                  WHERE email_address='$email'AND password= '$hash'
                  LIMIT 1") or die("error in members table");

$login_check = mysql_num_rows($sql);

它看起来很好,只是我将把login.php查询从
WHERE email\u address='$email'和password='$hash'
写入
WHERE email\u address='$email'和password='$hash'

确保保存密码哈希的列数据类型足够长,可以包含用户将输入的任何密码。如果额外的数据字节不是问题,那么将列设置为varchar(255),以确保MySQL在保存哈希时不会将其结尾切掉

我会查看一些内置的加密库。它们从PHP5.5开始就已经更新了,如果bcrypt不能正常工作,它们可能会帮你完成这项工作


我过去使用过md5,没有任何问题,如果您真的担心它的超级安全,请查看php内置的mcrypt库。您还可以对密码进行“加密”,以确保密码处于安全状态。

您显然在使用第三方库进行Bcrypt哈希。PHP内置了bcrypt功能,我想这个库就是一个包装器。但我不能确定,因为我不认识你正在使用的库,所以我不能给出关于如何使用它的具体建议(除了遵循它的文档)

考虑到我无法识别您正在使用的库这一事实,您的代码的bcrypt部分没有明显的错误。(sql查询的变量没有在任何地方定义,但我想这是因为您只向我们展示了一段代码)

如果你对这个库没有任何进展,我建议你去看看其他的库;我认为有两种方法值得一看:


  • 这是同一个人写的,他负责PHP核心中的所有安全代码。在PHP5.5(即将发布)中,他们引入了一组新的
    password\u xxx()
    函数。这个库在纯PHP代码中实现了这些相同的函数,因此它们可以在PHP5.3或5.4中运行。因此,如果您希望与未来的PHP版本兼容,那么这个库是一个很好的选择


  • 由同一作者创建的稍旧的图书馆。同样好,但是使用面向对象的API,而不是模仿PHP5.5函数。如果您想要一个通用的实用程序库,使其能够非常容易地处理具有完全安全性的密码,这就是我推荐的一个

这两个库都在幕后使用最新的bcrypt算法


[编辑]密码字段长度。如注释中所述,您需要至少有60个字符长的字段来存储bcrypt哈希。您当前的20个字符限制不适用于任何类型的哈希算法。

bcrypt是一种安全的密码哈希算法。md5不安全。它不应用于密码。重新编辑:不,md5不安全,即使使用了salt。我没说麦克里普的事。但我可以告诉你,bcrypt被认为是密码散列的最佳实践。此外,这是PHP推荐的哈希方法,也是他们在新的PHP5.5
password\uxx()
函数中使用的方法。没有理由使用其他任何东西,这很公平。这基本上只是一个建议。我从来没有用过BCrypt,所以我不能说它是否有用。我通常坚持使用mcrypt和salting,但现在看来这将是一个努力解释的过程。@Spudley我的代码是否正确,如果不是的话,如何在loginIt中特别使用它看起来是正确的。您是否发布了任何错误文本来帮助查看失败的具体原因?或者只是说密码不正确?请记住,
mysql\u xx()
函数已被弃用,不再受支持。你应该考虑切换到使用PDO库。我只记得我遇到了一个问题,代码也很好,但是密码被拒绝了。创建数据库表时,您为密码列选择了什么数据类型?它是否有足够的空间来正确保存哈希?如果MySql太长,它会把两端剪掉。很可能就是这样。检查平均散列的长度并将其加倍。为了安全起见,可能需要使用varchar(255)。当涉及到安全性时,最好使用两个额外的字节。是的,肯定是这样。varchar 20甚至不够大,无法安装md5。对于bcrypt哈希,需要60个字符。我会把它加到我的答案中。@CP510-你也应该这样做。