Проверка, является ли строка sha1 в PHP - PullRequest
14 голосов
/ 06 июня 2010

Я планирую хранить пароли как sha1, поэтому мне нужен способ проверить, что это sha1 в другой точке моего сайта Я планировал использовать preg_match, но я не знаю, как создавать шаблоны регулярных выражений. Может ли кто-нибудь помочь мне с одним?

Спасибо

Редактировать: я не пытаюсь увидеть, совпадают ли два хэша.

Ответы [ 3 ]

46 голосов
/ 06 июня 2010

На самом деле, вы можете использовать preg_match(), чтобы убедиться, что это шестнадцатеричная строка из 40 символов как таковая:

function is_sha1($str) {
    return (bool) preg_match('/^[0-9a-f]{40}$/i', $str);
}

Чтобы объяснить шаблон:

/ Opening Delimiter
^ Start Of String Anchor
[0-9a-f] Any of the following characters: 0123456789abcdef
{40} Repeated 40 times
$ End Of String Anchor
/ Closing Delimiter
i Modifier: Case-Insensitive Search


Если вы пытаетесь убедиться, что хеш sha1() совпадает с паролем провайдера пользователя, вы просто перепишите его так:

if($db_hash == sha1($user_provided_pass))
   echo "Password is correct!";
9 голосов
/ 09 мая 2012

ctype_xdigit намного быстрее. Обычно я использую хеш для поиска и считаю его очень полезным.

0 голосов
/ 06 июня 2010

Когда вы сравниваете два хэша SHA1, и вы знаете, что первый равен одному (потому что он выходит из базы данных), то просто предполагает , что второй также является значением SHA1. Вас интересует только совпадение двух хешей или нет. Если одно из сравниваемых значений не является возможным значением SHA1, то оно, в частности, не совпадает со значением в базе данных. И это все, что вам нужно знать.

...