我正试图为我的程序提供最好的密码安全,经过一些研究后,所有的道路似乎以PHPASS作为我最好的选择。我在做一些实验来了解我在做什么。我看到PHPASS向密码中添加了一个随机盐,然后对其进行散列,以便将其存储在DB中,用户现在就可以注册了!.This对我来说很好。我不明白,当用户登录时,我从DB检索哈希,并将其与用户在登录时输入的密码进行比较,但这次新哈希是不同的,因为它是从不同的盐中生成的?而在那里,由于与存储在DB.Somewhere中的不匹配,我是愚蠢的,缺少了其他人都能得到的显而易见的东西。请帮帮我,因为我似乎是弱智!
发布于 2013-12-11 13:33:57
是的,这是一个很好的图书馆。但是,如果您有PHP,则没有必要,因为类似的功能是内置在5.5+中的。
使用$hasher->CheckPassword($pass, $hash)检查密码,而不是重新散列密码。通过这种方式,它确保使用相同的salt ( salt存储在哈希开始时,就像哈希算法一样)。
发布于 2013-12-11 15:24:36
PHPASS返回包含用于计算哈希的算法、哈希的成本、使用的salt以及我假设的算法的结果的哈希,因此取决于所使用的密码。
算法:
对于bcrypt散列,这应该是'$2y$',虽然'$2x$‘和'$2a$’也是可能的。见PHP在crypt()上的手动输入。(如果有可用的话,PHPASS使用crypt() )
成本:
2个字符宽零填充值在04-31范围内.1<<<cost>将在内部使用,这就是为什么31是上限(可用的32位)。
盐:
字母"./0-9A-Za-z“中的22个字符。
当将散列用作盐类时,将不使用其余字符。
以下是一些代码及其输出,这些代码和输出可能会澄清正确使用时的工作方式:
<?php
echo crypt('meow', '$2y$05$' . str_repeat('.', 20) . '//meow'), PHP_EOL; // salt: ....................//
echo crypt('meow', '$2y$05$' . str_repeat('.', 20) . '//woof'), PHP_EOL; // salt: ....................//
echo crypt('meow', '$2y$05$' . str_repeat('.', 20) . '//oink'), PHP_EOL; // salt: ....................//
echo PHP_EOL, '###########################', PHP_EOL, PHP_EOL;
echo $meow = crypt('meow', '$2y$05$' . str_repeat('.', 20) . '/meow'), PHP_EOL; // salt: ..................../m
echo $woof = crypt('meow', '$2y$05$' . str_repeat('.', 20) . '/woof'), PHP_EOL; // salt: ..................../w
echo $oink = crypt('meow', '$2y$05$' . str_repeat('.', 20) . '/oink'), PHP_EOL; // salt: ..................../o
echo PHP_EOL, '###########################', PHP_EOL, PHP_EOL;
echo crypt('meow', $meow), PHP_EOL; // salt: ..................../m
echo crypt('meow', $woof), PHP_EOL; // salt: ..................../w
echo crypt('meow', $oink), PHP_EOL; // salt: ..................../o
echo PHP_EOL, '###########################', PHP_EOL, PHP_EOL;
var_dump(
$meow === crypt('meow', $meow),
$woof === crypt('meow', $woof),
$oink === crypt('meow', $oink)
);
$2y$05$..................../.0/SFonSqiMg1jG/nWVk278LFl597ZlC
$2y$05$..................../.0/SFonSqiMg1jG/nWVk278LFl597ZlC
$2y$05$..................../.0/SFonSqiMg1jG/nWVk278LFl597ZlC
###########################
$2y$05$..................../eZ/qB29TfhKdQOwZTIrLyzBTMYOwupD6
$2y$05$..................../u45Ujx7ViT/dCkbXPqwsVuv407AA/99a
$2y$05$..................../eZ/qB29TfhKdQOwZTIrLyzBTMYOwupD6
###########################
$2y$05$..................../eZ/qB29TfhKdQOwZTIrLyzBTMYOwupD6
$2y$05$..................../u45Ujx7ViT/dCkbXPqwsVuv407AA/99a
$2y$05$..................../eZ/qB29TfhKdQOwZTIrLyzBTMYOwupD6
###########################
bool(true)
bool(true)
bool(true)发布于 2013-12-11 20:03:42
谢谢你的帮助,偷窥,我现在似乎让它工作,但如果你愿意为我检查它,如果它是好的,其他人可能会发现它有帮助,请记住,它只是测试文件,所以会增加更多,如果核心是好的。
这是REG代码,它对密码进行散列并存储它。
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_BCRYPT);
if (empty($_POST) === false){
mysql_query("INSERT INTO `accounts` VALUES ('', '$username', '$hash') ");
echo 'Done';
}else{
echo 'Not Done';
}
} ?>这是登录
<?php
require('../password/lib/password.php');
require_once("connect.php");
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$safe_username = mysql_real_escape_string($username);
$password = $_POST['password'];
$query = "SELECT * FROM accounts WHERE username = '$safe_username'";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
$hash = $row['password'];
if (password_verify($password, $hash)) {
echo 'Logged in';
} else {
echo 'Not logged in';
}
} else {
echo " Not submitted";
}你认为如何?
https://stackoverflow.com/questions/20520502
复制相似问题