• Как можно безопасно передавать пароли при авторизации в WordPress ?

    Много искал, но нигде для WordPress нет ничего описанного об безопасной авторизации, например такой при которой пароли не передаются вообще, а лишь генерируются временные хэш ключи на сервере и клиенте, а после на сервере сравниваются их значения.
    Хотел такое реализовать сам, но WordPress не хранит пароль в хэше типа md5 или sha1, он хранит пароль в таком хэше который каждый раз при шифровании пароля уникальный, пример такой функции wp_hash_password()

    По этому нельзя так сделать с временным ключами, как это можно было бы сделать с хэшами типа md5 или sha1 и т.п.
    Средствами WordPress сравнить правильность пароля можно только имея текстовый пароль в открытом виде и шифрованный хэш пароль который находится в базе данных, например этой функцией: wp_check_password()

    Также и залогинится можно например этими функциями: wp_signon(), но здесь надо также пароль в открытом виде.

    Теперь такое, без пароля можно авторизировать пользователя по ID вот этой функцией: wp_set_auth_cookie()

    Но что бы иметь возможность сделать авторизацию без передачи пароля например, на клиенте захэшировать пароль с помощью JS таким же методом ка это делает WordPress, а после сравнить эти хэши на сервере:
    Код
    http://wp-kama.ru/function/wp_hash_password
    http://wp-kama.ru/filecode/wp-includes/class-phpass.php
    для этого необходимо иметь возможность сравнивать эти хэши по типу как это делает функция wp_check_password(), только в ней указывается текстовый пароль и хэш, а надо сравнить именно хэш пароля с клиента и хэш пароля с базы данных сайта.

    Скажите есть ли какие то функции WP, PHP или средства для сравнивания этих типов хэшей?

    Ведь функция wp_check_password( $input_text_password, $hash_password ), как то же делает сравнение текстового и хешированного пароля…?

Просмотр 13 ответов — с 1 по 13 (всего 13)
  • Модератор Юрій

    (@yube)

    Функция wp_check_password() относится к замещаемым, т.е. Вы можете переписать ее, а также wp_generate_password() и прочие функции, определенные в pluggable.php, так, как Вам нужно. Фактически, сделать плагин со своей собственной альтернативной, надежной и безопасной системой авторизации. Удачи!

    Модератор Yui

    (@fierevere)

    永子

    сравнение строки хеша со строкой хеша ничем в вашем случае не будет отличаться от сравнения пароля с паролем, разве что пароль будет не 123456, а преобразованый в хеш

    если хотите , то можно не изобретать велосипед а посмотреть на имеющиеся алгоритмы
    https://ru.wikipedia.org/wiki/CRAM-MD5 например, сразу — недостаток что пароль на сервере хранится открыто.
    Ну или асимметричные ключики применяйте, вообще безопасно, но сложно к реализации.

    Безопасно и просто к реализации — 2 Факторная авторизация.

    Задержка в том что я не знаю можно ли и как именно сравнить эти два хэша паролей..?

    if ( wp_check_password( "input_text_password", $server_hash_password ) )
    а надо что то типа
    if ( wp_check_password( $client_hash_password, $server_hash_password ) )

    К примеру:

    echo wp_hash_password( "111" ); // Результат: $P$BoCWftwFtN8sUMkmZNJvUO5kLmMOMb0
    echo "<br>";
    echo wp_hash_password( "111" ); // Результат: $P$BZiVqS35VVNvGlF5xHD561ShKKxWvH1

    Как теперь сравнить что эти два хэша один и тот же пароль «111» ?

    Результат: $P$BoCWftwFtN8sUMkmZNJvUO5kLmMOMb0
    Результат: $P$BZiVqS35VVNvGlF5xHD561ShKKxWvH1

    Я понимаю что сравнить хэши паролей в md5 просто:

    $pass_client = md5("пароль");
    $pass_server = md5("пароль");
    if( $pass_client == $pass_server ) echo "OK";

    А вот вопрос в том как сравнить эти хэши паролей:

    $pass_client = wp_hash_password( "111" ); // Результат: $P$BoCWftwFtN8sUMkmZNJvUO5kLmMOMb0
    $pass_server = wp_hash_password( "111" ); // Результат: $P$BZiVqS35VVNvGlF5xHD561ShKKxWvH1
    if( my_func( $pass_client, $pass_server ) ) echo "OK";

    Так как хэши пароля каждый раз уникальные в отличии от хэша md5 и тому подобных.

    • Ответ изменён 8 лет, 5 месяцев назад пользователем avense.
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    сделать авторизацию без передачи пароля например, на клиенте захэшировать пароль с помощью JS таким же методом ка это делает WordPress, а после сравнить эти хэши на сервере

    Если всё равно делать собственный вариант авторизации, то зачем привязываться к тому, что делает WordPress?

    Можно генерировать и сравнивать ключи любым другим алгоритмом, подходящим для ваших целей, а при совпадении просто вызывать функцию wp_set_auth_cookie().

    Мне нужно что бы авторизация была все же WordPress-совская, всего то надо сравнить хэши этого типа —> wp_hash_password()
    Это вообще возможно?
    Как то же сравнивает функция wp_check_password() простой пароль…
    Смотрел её в wp-includes, но не разобрался.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Как то же сравнивает функция wp_check_password() простой пароль…

    Там вызывается метод PasswordHash::CheckPassword() из библиотеки phpass.

    всего то надо сравнить хэши этого типа —> wp_hash_password(). Это вообще возможно?

    Нет. Если бы для входа было достаточно только хеша — можно было бы с тем же успехом хранить в базе пароли в открытом виде: злоумышленник, получивший дамп базы, мог бы моментально авторизоваться на сайте, не подбирая пароль.

    всего то надо сравнить хэши этого типа —> wp_hash_password(). Это вообще возможно?

    Нет. Если бы для входа было достаточно только хеша — можно было бы с тем же успехом хранить в базе пароли в открытом виде: злоумышленник, получивший дамп базы, мог бы моментально авторизоваться на сайте, не подбирая пароль.

    Ну если сравнить не возможно, тогда не получится сделать задуманное.
    Пускай даже WordPress хранит пароли в md5 далее в хэше методом wp_hash_password, но ведь передается пароль при авторизации в открытом виде, что не есть надежно, разве что если использовать соединение по протоколу SSL.

    но ведь передается пароль при авторизации в открытом виде, что не есть надежно,

    Можно вставить своё ИМХО? 🙂 снифить трафик в большинстве случаев нерационально. Есть много куда более простых способов узнать необходимую инфу о юзере.

    Ну и вообще, если что:

    Безопасно и просто к реализации — 2 Факторная авторизация.

    Благо даже плагны для этого есть.

    Ну или как идея/фантазия: аддон к браузеру или десктоп ПО, кодирующий (соль?) передающийся пароль, а на сервере уже расшифровка и в ВП.

    • Ответ изменён 8 лет, 5 месяцев назад пользователем SeVlad.
    Модератор Yui

    (@fierevere)

    永子

    https://ru.wordpress.org/plugins/search.php?q=one+time+password
    вот вам еще вариант, одноразовые пароли

    ps: хотя чистых OTP там нет, только 2ФА

    • Ответ изменён 8 лет, 5 месяцев назад пользователем Yui.

    Благодарю всех!
    Попробую делать двух факторную авторизацию или использовать соответствующие плагины.

    • Ответ изменён 8 лет, 5 месяцев назад пользователем avense.

    Ну или как идея/фантазия: аддон к браузеру или десктоп ПО, кодирующий (соль?) передающийся пароль, а на сервере уже расшифровка и в ВП.

    А можно и яваскриптом присолить.. Да просто добавить символы, которые потом удалить.
    Правда юзеры без js пострадают..

    Попробую делать двух факторную авторизацию или использовать соответствующие плагины.

    Только стоит помнить, что не всех хотят это использовать. Не отпугните пользователей.

    Только стоит помнить, что не всех хотят это использовать. Не отпугните пользователей.

    Да, как дополнительный вариант на выбор, с галочкой в форме входа или в настройках профиля 🙂

Просмотр 13 ответов — с 1 по 13 (всего 13)
  • Тема «Безопасная авторизация и сравнение хэш значений паролей в WP» закрыта для новых ответов.