我的数据库名为 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;
}
}
答案 0 :(得分: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
并不奇怪吗?
答案 1 :(得分:0)
这一切都归结于此。在将用户密码保存到数据库之前,需要对用户密码执行操作。然后,在检查密码是否对用户名/密码组合有效之前,对提交的密码执行相同的操作。
在大多数情况下,“操作”是哈希或加密过程,例如MD5或bcrypt
答案 2 :(得分:-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 );
但这与存储密码无关......