Как сохранить имя пользователя и пароль для API в базе данных Wordpress?

19

В настоящее время я разрабатываю плагин, и есть вероятность, что я, скорее всего, опубликую его в общедоступном хранилище плагинов, чтобы другие могли его использовать.

Плагин будет использовать API, и для использования этого API вам необходимо передать имя пользователя и пароль. Так что мой плагин должен хранить эти учетные данные для входа в базу данных. Я не хочу хранить их в виде простого текста, хотя API нуждается в них в виде простого текста.

Итак, мой вопрос: как мне сохранить эту чувствительную информацию? Хеширование отключено, поэтому должно быть какое-то шифрование.

В WordPress есть уникальный ключ, который можно использовать в разных блогах? Какие функции php я должен использовать для шифрования и дешифрования? Я ищу функции, которые, скорее всего, будут работать на всех установках WP.

Brady
источник
3
Это вроде неразрешимо. Неважно, сколько вы шифруете, если оно должно быть обратимым. Если WP может расшифровать его и WP скомпрометирован, то шифрование не имеет значения.
Первое
Но почему вашему API нужно знать пароль? Разве этого недостаточно, если API знает, что пользователь знает пароль?
onetrickpony
1
@ One Trick Pony - пароль должен быть сохранен, чтобы процесс можно было автоматизировать без вмешательства пользователя.
Брэди,
1
@Rarst - я знаю, что если WP скомпрометирован, то и пароли тоже. Я не могу предотвратить это. Что я могу предотвратить, так это то, что если получен дамп SQL, то пароли не отображаются в виде обычного текста.
Брейди
@Brady Да, если скомпрометирован только дамп SQL, шифрование поможет. Однако я считаю такой сценарий маловероятным. Если у вас есть доступ к базе данных, компромисс с WP тоже тривиален.
Первое

Ответы:

4

Хотя я согласен с предыдущими ответами, чтобы ответить на вопрос, который вы фактически задали, мне приходит в голову использовать одну из этих констант для wp-config.php:

define ('AUTH_KEY', 'redacted');
define ('SECURE_AUTH_KEY', 'отредактировано');
define ('LOGGED_IN_KEY', 'отредактировано');
define ('NONCE_KEY', 'отредактировано');

Предполагается, что они уникальны в установках WordPress и являются единственными вариантами уже существующих ключей, которые можно найти в WordPress. В качестве альтернативы можно добавить собственную аналогичную константу, которая создается путем хеширования одной из них на адрес электронной почты администратора или аналогичной, а затем сохранения ее в скрытом параметре настройки, чтобы предотвратить потерю ключа, если кто-то случайно модифицирует ключи после вашей плагин установлен. Опасность заключается в том, что если они не были сделаны уникальными при первоначальной установке, но администратор / владелец сайта решает исправить ошибку после факта, им не следует случайно нарушать шифрование вашего пароля.

Что касается функций шифрования / дешифрования - быстрый поиск в Google возвращает следующий список с кодом, который, как представляется, отвечает всем требованиям: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong- шифрование-дешифрование-PHP-функция /

функция шифрования ($ input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = hash ('sha256', $ key, TRUE);
    вернуть base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ h_key, $ input_string, MCRYPT_MODE_ECB, $ iv));
}

расшифровка функции ($ encrypted_input_string, $ key) {
    $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND);
    $ h_key = hash ('sha256', $ key, TRUE);
    возвращаемое значение (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ h_key, base64_decode ($ encrypted_input_string), MCRYPT_MODE_ECB, $ iv));
}

Вот некоторая документация по шифрованию AES, используемому здесь: http://www.chilkatsoft.com/p/php_aes.asp

marfarma
источник
4

Это как раз то обстоятельство, для которого был разработан OAuth.

С домашней страницы OAuth :

Для разработчиков сервис-провайдеров ...

Если вы поддерживаете ...

  • веб-приложения
  • серверные API
  • коллажи

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

Преимущество OAuth в том, что вам не нужно хранить пароль пользователя. Когда они впервые настраивают плагин, их просят войти в систему с именем пользователя и паролем через приложение (обычно это страница, размещенная на том же сервере, что и API, и загруженная либо в виде перенаправления страницы, в толстом ящике, либо в iframe) ,

Как только пользователь вошел в систему, сервер (ваша система) создает безопасный ключ, который его система (WordPress) может использовать для взаимодействия с API. Этот ключ уникален для учетной записи пользователя и сайта - и он дает приложению (на WordPress) разрешение выполнять действия с API от имени пользователя, не передавая при этом свою информацию для аутентификации каждый раз.

Если вы хотите увидеть пример этого в действии, посмотрите Jetpack .

Когда вы активируете плагин, он жалуется, что он не подключен. Когда вы «подключаете» его, вы вводите свои учетные данные через WordPress.com и настраиваете взаимодействие OAuth между WordPress и их API.

Но вам нужно сделать это только один раз, и ваше имя пользователя / пароль WordPress.com никогда не будет храниться в вашей локальной базе данных WordPress.

EAMann
источник
1
Было бы неплохо использовать это, но API, с которым я имею дело, не мой, и у них нет системы OAuth.
Брейди
1
В этом случае ваш единственный реальный вариант - признать, что вам нужно хранить пароль в БД, и то, действительно ли вы шифруете его, на самом деле не существенно отличается от безопасности. Как уже упоминалось выше, если он находится в БД и шифрование является обратимым, то любой, кто имеет доступ к WordPress (легитимный или взломанный), может получить его.
EAMann
0

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

Это не (пока) реальный ответ на вопрос, но и слишком длинный для комментария. Я надеюсь начать с этим дискуссию с целью найти «наилучшее» решение этой «неразрешимой» проблемы.

Основная идея, которая заставляет меня думать, что шифрование паролей возможно, заключается в следующем:

У каждого пользователя есть одна секретная информация: пароль Wordpress. Должна быть возможность хранить учетные данные в сторонних службах, зашифрованные с помощью секретной производной формы этого пароля, и расшифровывать их только при входе пользователя в систему.

Таким образом, должна быть возможность, по крайней мере, сделать невозможным кражу паролей из копии файлов Wordpress и базы данных. Это не может решить проблему, связанную с кражей учетных данных других плагинов, потому что каждый плагин может захватить простой текстовый пароль во время входа в систему.

На самом деле дешифрование довольно просто сделать: предположим, у нас уже есть зашифрованная версия стороннего сервиса, хранящегося в базе данных, мы можем подключиться к 'authenticate'фильтру или, перезаписав wp_authenticate()функцию, сгенерировать соленый хэш пароля пользователя в виде простого текста (с помощью средство wp_hash_password()), храните хешированный пароль в качестве ключа шифрования где-то в секрете, пока пользователь не выйдет из системы (используйте'wp_logout' хук для удаления ключа), и используйте его каждый раз, когда нам потребуется сторонний пароль для расшифровки зашифрованного значения в базе данных.

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

  1. Как сделать шифрование? Потенциально можно хранить простой текстовый пароль до тех пор, пока пользователь не выйдет и не войдет снова и не выполнит шифрование во время 'authenticate'. Пользователю может быть предложено войти, чтобы сохранить период, пока это не произойдет коротким.
  2. Где хранить ключ и как его удалить при выходе из системы? Правильно ли я понимаю, что 'authenticate'он запускается только тогда, когда пользователь действительно входит в систему?
  3. В случае, если теперь есть способ сохранить хешированный пароль, может быть, вместо этого можно получить ключ из cookie сеанса?
  4. Кто должен обрабатывать изменения пароля? Похоже, что можно перехватить такие изменения пароля, и тогда сторонний пароль должен быть повторно зашифрован с помощью ключа, полученного из нового пароля.
  5. Есть ли способ обеспечить многопользовательскую поддержку? В идеале хотелось бы, чтобы пользователь-администратор мог устанавливать сторонние пароли в настройках, которые затем могут использоваться менее привилегированными пользователями для взаимодействия со сторонними сервисами, в идеале даже без раскрытия им этих паролей. Для этого пользователь-администратор должен иметь возможность создавать ключи для всех пользователей, которые другие пользователи могут создавать только для себя. Это как-то возможно?
cgogolin
источник