0

我有一个注册页面,允许用户输入其中一个密码的信息,因此必须对其进行加密或散列,因此使用 Bcrypt 并且它可以在寄存器上工作

但是当涉及到登录时,我不知道在哪里以及如何使用它
,任何人都可以帮助我吗?

注册.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");

登录.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);
4

2 回答 2

0

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

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

如果您对这个库没有任何帮助,我建议您查看替代库;我能想到的有两个很好看:

  • password_compat
    这是由编写 PHP 核心中所有安全代码的同一个人编写的。在 PHP 5.5(即将发布)中,他们引入了一组新password_xxx()函数。这个库在纯 PHP 代码中实现了这些相同的功能,因此它们可以在 PHP 5.3 或 5.4 中运行。因此,如果您想与未来的 PHP 版本兼容,那么这个库是一个不错的选择。

  • PHP-Password
    同一作者的稍旧的库。一样好,但使用面向对象的 API 而不是模仿 PHP 5.5 函数。如果您想要一个通用实用程序库,以使处理具有完全安全性的密码变得容易,这是我推荐的。

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

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

于 2013-05-17T21:54:18.477 回答
0

对我来说看起来不错,只是我会将 login.php 查询从WHERE email_address='$email'AND password= '$hash'toWHERE email_address='$email' AND password='$hash'

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

我会查看一些内置的密码库。它们自 php 5.5 起已更新,如果 bcrypt 无法正常工作,它们可能会为您完成这项工作。

http://www.php.net/manual/en/refs.crypto.php

我过去使用过 md5 没有任何问题,如果你真的担心它超级安全,请查看 php 内置的 mcrypt 库。您也可以“加盐”密码以确保它们安全。

于 2013-05-17T21:32:41.823 回答