PHP password_hash每次都在变化

时间:2016-06-11 15:30:44

标签: php passwords php-password-hash

我有代码

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

每次运行脚本时,密码都会更改

我使用的是PHP 7,在PHP 5中,我曾经能够设置盐,但现在我无法

如果不知道盐是什么我该怎么办?

2 个答案:

答案 0 :(得分:2)

每次以这种方式运行password_hash时,您可能会看到新哈希的原因是因为它会自动生成一个新的随机盐,即使输入的密码是相同

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

在任何情况下,crypt只是crypt上的一个瘦包装器,它暴露了底层API的更多基元。所以如果你想通过password_hash提供自己的盐,你仍然可以。虽然我非常不赞成使用PHP #![feature(type_macros)] extern crate typenum; #[macro_use] extern crate generic_array; extern crate num; use num::{Float, Zero}; use typenum::*; use generic_array::*; #[derive(Clone, Debug)] struct Vector<T, N: ArrayLength<T>> { data: GenericArray<T, N> } impl<T, N: ArrayLength<T>> Vector<T, N> where T: Float + Zero { fn dot(&self, other: Self) -> T { self.data .iter() .zip(other.data.iter()) .fold(T::zero(), |acc, x| acc + *x.0 * *x.1) } fn length_sq(&self) -> T { self.dot(self.clone()) } } 并且以一种不太可能导致错误的方式为你做这件事。

答案 1 :(得分:1)

  

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

正如文档所述,salt会生成并存储在返回的哈希中,因此无需将salt传递给函数或单独存储它。

有关如何使用password_hash的简单示例,请参阅this答案。