检查用户名(散列)或电子邮件(哈希)alredy是否存在与pdo

问题描述:

我想验证用户名或电子邮件是否在注册表中被采取,但我不明白该怎么做,因为两者都是哈希在我的数据库与password_hash(),我怎么可以比较,用户输入数据库中的pdo?请解释我的代码,我是新的PHP ...谢谢,在您的时间建议,最好的问候检查用户名(散列)或电子邮件(哈希)alredy是否存在与pdo

+0

'$ hashedEmail = get_hashed_email_from_database();如果(password_verify($ _ POST ['email'],$ hashedEmail)){//他们匹配}'http://php.net/manual/en/function.password-verify.php – Steve

+1

顺便说一句,为什么你哈希电子邮件? – Steve

+1

嗯......这就是为什么散列主帐户标识符(用户名/电子邮件)并不十分有用。至少你需要散列它没有一个单独的盐,但这也不是非常有用。 – deceze

如果您的电子邮件会使用每个散列的独特盐进行散列处理,但无法测试任何一个特定电子邮件是否存在,因为无法在数据库中针对所有散列进行测试。例如: -

foreach ($db->query('SELECT email_hash FROM users') as $user) { 
    if (password_verify($_POST['email'], $user['email_hash'])) { 
     $found = true; 
     break; 
    } 
} 

有没有其他办法,因为你不能没有个人盐重新哈希,因为你不知道什么盐你正在寻找你只需要做他们。

如果你将散列数据,你需要在数据库中进行搜索,至少它不能被腌制。但是,如果它不被腌制,那么它对于你试图防御的情况几乎没有保护作用。底线:你需要查询的哈希数据是毫无意义的。

+0

谢谢,这是解决方案! –

+1

如果您指的是PHP代码片段:**否,那是一个_terrible_解决方案,**我希望这是不言而喻的。如果你有几千个用户,这将变得难以忍受。 – deceze

+0

@ A.Rossi - 你不能使用这个例子,因为函数password_hash()被设计得很慢,这意味着只有少数用户请求仅需要几秒钟就可以搜索一个用户。 – martinstoeckli