-4

我的数据库中有下表,名为db_pass

id | pass
=================
1  | dalmation123

我知道我无法在数据库中以纯文本格式存储任何密码,我该如何设置哈希?这是我在下面使用的代码。对于如何更改我的表db_pass,我也将不胜感激。

if(isset($_POST['pmsubmit']))
{
  LoginSubmit('pm', 'pmname', 'pmpass');
}

if(isset($_POST['tssubmit']))
{
  LoginSubmit('ts', 'dept', 'tspass');
}

function LoginSubmit($pm_or_ts, $the_name_input, $the_pass_input)
{
  global $pdo;
  $posted_name = $_POST[$the_name_input];
  $posted_pass = $_POST[$the_pass_input];
  // check if password matches the one in the table
  $query = $pdo->prepare("SELECT * FROM db_pass WHERE pass = :pass");
  $query->execute(array(":pass" => $posted_pass));
  // if there is a match then we log in the user
  if ($query->rowCount() > 0)
  {
    // session stuff
    $_SESSION[$the_name] = $posted_name;
    // refresh page
    header( 'Location: ' . $pm_or_ts . '/index.php' ) ;
    exit;
  } 
  // if there is no match then we present the user with an error
  else
  {
    echo "error";
    exit;
  }
}
4

3 回答 3

1
$query = $pdo->prepare("SELECT * FROM db_pass WHERE pass = :pass");
$query->execute(array(":pass" => crypt($posted_pass)));

不要问我crypt实际使用的是哪种算法。手动输入完全是荒谬的 - 显然只是检查一个常量的值会改变所使用的算法crypt()是荒谬的......

人们说 bcrypt 也没关系。但是 bcrypt不是PHP 的核心函数。如果他们的意思是写你自己的,那么这是一个愚蠢的想法——因为你的实现无疑会有缺陷。如果他们的意思是一个图书馆,他们需要指出一个 - 通常推荐 PHPass,但我自己不知道推荐它。

大多数人仍在使用这并不奇怪sha1,是吗?

于 2013-02-05T22:19:49.693 回答
0

这一切都归结为这一点。在将用户密码保存到数据库之前,您需要对用户密码进行操作。然后,您在检查该密码是否对用户名/密码组合有效之前对提交的密码执行相同的操作。

在大多数情况下,“操作”是散列或加密过程,例如 MD5 或 bcrypt

于 2013-02-05T22:15:38.167 回答
-1

在 MySQL 中,您可以使用该BINARY类型来实际存储哈希值。MySQL 中的一个简单哈希表可能如下所示:

CREATE TABLE IF NOT EXISTS `hastable` (
  `hash` binary(20) NOT NULL,
  `value` blob NOT NULL,
  PRIMARY KEY (`hash`)
);

例如,SHA1 哈希总是 160 位/20 字节长,可以存储这样的二进制列。使用 PHP,您可以获得如下哈希:hash( 'sha1', $key, true );

但这与存储密码无关……</p>

于 2013-02-05T22:06:43.130 回答