3

我有一个执行一些简单验证的用户类。我想使用 phpass 将所有密码存储为哈希值。但是,我不希望它是 User 类的工作来设置哈希,这是其他一些函数的工作。因此,如果我有一个名为 setPassword 的简单函数,我如何确保密码是哈希。is_binary 有效吗?我不是在这里比较哈希值,我只是想确保密码是哈希值..无论哪种类型的 md5..sha1...blah 都无关紧要。我只是想确保密码是哈希。

例子:

class User
{
    private password = NULL;
    private $errors = array();

    public function setPassword($password)
    {
        // make sure password is a hash...pseudo code
        if (!password_is_hash($password))
        {
            $this->errors[] = 'Invalid password';
            return $this;
        }
        $this->password = $password;
        return $this;
    } 

    public function getPassword()
    {
        return $this->password;
    }
}
4

4 回答 4

11

我不确定它是否总是正确/安全,但您可以使用该password_get_info功能。如果方法无法猜测算法,我们可以假设字符串不是哈希。

function password_is_hash($password)
{
    $nfo = password_get_info($password);
    return $nfo['algo'] != 0;
}

这不适用于 sha1 或 md5 等简单算法。

于 2016-02-04T16:34:02.063 回答
0

我不太确定您要做什么,但我认为您为什么要检查密码是否是哈希值。

如果您使用任何函数/库使其散列,那么您可以检查该函数是否成功完成散列。

除此之外,您无法识别字符串是否为哈希(ed),因为它是一个字符串。

于 2013-10-16T14:49:12.737 回答
0

所有哈希都只是字符串。所以你不能准确地检查它是否是散列。MD5 哈希看起来a23b34c45d56a23b34c45d56a23b34c4和你无法区分myrealreallooooongpassword111222

于 2013-10-16T14:34:06.203 回答
0

正如其他人所说的那样,哈希是字符串,尽管(在某些情况下)您可以说 md5 或 sha1 始终是 n 个字符,但您不能保证给定的字符串是哈希。

如果您现在想要的是将用户提供的密码与保存在数据库中的哈希值进行比较,您可以从数据库中获取保存的哈希值,然后使用用于创建保存的哈希值的相同函数对提供的字符串进行哈希处理,并确保它们相等并且认证。

于 2013-10-16T14:41:08.023 回答