2016-06-11 168 views
-4

我的代码PHP password_hash每次都改变

echo password_hash('i=badatphp', PASSWORD_BCRYPT, [ 'cost' => 10 ]); 

我每次运行脚本的密码更改

我使用PHP 7,和PHP 5我曾经是能够设置盐,但现在我不能

我怎么克服不知道盐是什么?

+1

它不是密码的变化,它是散列。另外,我相信版本7已经放弃了咸味选项。 –

+2

http://php.net/manual/en/function.password-hash.php ***警告** salt选项已从PHP 7.0.0开始弃用。现在,我们首选简单地使用默认生成的盐。*将此称为对您问题的回答,如果发生一些破解并将其用作下面的实际答案,我不会感到惊讶。 *叹息* –

+0

您应该使用提供的随机盐,并使用能够处理随机盐的password_verify()验证密码。 –

回答

1

原因你可能每次跑步password_hash这种方式是看到一个新的哈希值,因为它会自动生成一个新的随机盐,这将导致不同的散列即使输入的密码是一样的

虽然从PHP 7开始,salt选项是已弃用,但它绝对不会从password_hash中删除。虽然,你应该注意,弃用的原因是是因为它计划删除(可能在PHP的下一个次要版本中)。它计划搬迁的原因是因为它阻止人们使用低劣的生成盐的手段。由于该功能可以自动为您生成良好的随机盐,因此实际上很少有理由想要提供自己的。

在任何情况下,password_hash只是一个超过crypt的小封装,它揭示了更多底层API的原语。所以如果你想通过crypt提供你自己的盐,你仍然可以。虽然我非常不喜欢它,但PHP可以用password_hash这样做,并且不会导致错误。

+0

我完全不理解这个问题,对不起。我不确定cookie如何与这个问题相关,但是如果您将密码或密码的散列存储在cookie中,您肯定会做一些非常错误的事情。 – Sherif

+0

@LeeJeffries - 密码不应存储在cookie中。可以使用会话并将会话ID存储在cookie中,也可以使用身份验证服务并存储令牌,但不能直接存储密码。 – martinstoeckli

0

使用的算法,成本和盐作为散​​列的一部分返回。因此,所有需要验证散列的信息都包含在其中。这允许password_verify()函数验证散列,而不需要单独存储salt或算法信息。 http://php.net/manual/en/function.password-hash.php

作为文档状态,则生成的盐和存储在返回哈希所以没有必要为盐传递到功能或单独存放。

请参阅this解答如何使用password_hash的简单示例。

+2

您不应该在cookie中存储密码,因为它们可以被客户端查看和编辑。你能详细说明你想要做什么吗? (可能作为一个新问题,我不太熟悉stackoverflow的规则) – user3389196