Хранение паролей в обратимой форме

У меня есть приложение PHP, которое должно запускать сценарии bash и предоставлять имя пользователя и пароль (для удаленных систем). Мне нужно хранить эти учетные данные где-нибудь, доступном для моего PHP (веб-приложения). Логическим местом является база данных (в настоящее время MySQL, но будет независимой). Проблема "стандартного" способа хеширования и хранения учетных данных в том, что он необратим. Я имеют, чтобы иметь возможность получать учетные данные в виде незашифрованного открытого текста, чтобы иметь возможность вставлять данные в сценарии bash.

Есть ли у кого-нибудь предложения по безопасному способу решения этой проблемы?

Я подумал, может быть, PKI использует учетные данные и сохраняет результат в БД. Затем используйте закрытый ключ для расшифровки (PHP может это сделать). Храните сценарии для этого вне корневого веб-каталога.

Любые мысли очень ценятся.

Как насчет изменения заголовка на «Лучшие методы хранения зашифрованных данных, которые необходимо расшифровать»? поскольку это не относится к паролям?

Kenny Evitt 11.06.2012 20:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
17
1
5 677
12

Ответы 12

Вам нужно будет изучить хорошие двухсторонние криптографические методы, и мое общее практическое правило:

Если вы реализуете свой собственный криптографический код, вы потерпите неудачу.

Итак, найдите хорошую реализацию, которая хорошо проверена, и используйте ее.

Здесь, вероятно, есть полезная информация:

http://phpsec.org/library/

Извините, не могли бы вы высказаться. Я пропустил это.

Bob Probst 04.11.2008 05:56

Очевидно, есть немного (очень небольшое количество) людей, способных реализовать криптографический код, но вы бы знали, были ли вы одним из них! [Ну ... наверное, есть люди, которые ошибочно полагают, что они одни из этих людей, но все же ...]

Kenny Evitt 11.06.2012 19:55

Проверьте эту библиотеку: PECL gnupg предоставляет вам методы для взаимодействия с gnupg. Вы можете легко получить данные зашифровать и расшифровать, используя криптографические алгоритмы с открытым ключом безопасно.

Если вы перейдете на PKI, а я это сделаю, убедитесь, что вы надежно охраняете свои личные ключи! Надежное шифрование, обеспечиваемое PKI, надежно настолько, насколько надежны ваши ключи.

Я думаю, ты попал в цель. Посмотрите на GPG для хорошей открытой библиотеки шифрования

Похоже, у вас есть два способа сделать это:

1) Как вы предложили, используйте алгоритм или алгоритмы шифрования, которые затем можно расшифровать и использовать для аутентификации в ваших скриптах. Для этого вы можете использовать библиотеку MCrypt в PHP.

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

Один из простых способов начать - использовать функции mysql ENCODE () и DECODE (). Я не знаю, какой алгоритм используется ниже, но использовать его достаточно просто:

INSERT INTO tbl_passwords SET encoded_pw = ENCODE('r00t', 'my-salt-string');

и

SELECT DECODE(encoded_pw, 'my-salt-string') FROM tbl_passwords;

Вы неправильно употребляете термин «соль». Я думаю, вы имеете в виду "ключ"

Jesse Weigert 15.03.2009 14:26

Я бы посоветовал вам не хранить пароли, а использовать беспарольное ssh-соединение от хоста к удаленной системе, сгенерировав ssh-ключ и сохранив ваш открытый ключ в файле authorized_keys удаленной системы. Тогда вам нужно будет только установить соединение во время настройки. По общему признанию, не совсем отвечаю на ваш вопрос, но хранение паролей в обратимой форме - это скользкая дорожка к нарушению безопасности imho, хотя я уверен, что более умные мозги, чем мой, могут сделать это безопасным.

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

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

Если вы должны хранить расшифровываемые учетные данные:

  1. Выберите хороший алгоритм шифрования - AES-256, 3DES (с датой) или шифр с открытым ключом (хотя я думаю, что в этом случае нет необходимости). Используйте криптографическое программное обеспечение из авторитетного и надежного источника - НЕ ПЫТАЙТЕСЬ СВОИМ СВОИМ НАРУШИТЬ, ВЫ СЕЙЧАС ПОЛУЧИТЕ ЭТО НЕПРАВИЛЬНО.
  2. Используйте генератор случайных чисел безопасный для генерации ваших ключей. Слабая случайность - это основная причина сбоев безопасности, связанных с шифрованием, а не алгоритмы шифрования.
  3. Храните ключ (и) шифрования / дешифрования отдельно от вашей базы данных в защищенном O / S файле, доступном только для вашего профиля времени выполнения приложений. Таким образом, если ваша БД взломана (например, через SQL-инъекцию), ваш ключ не будет автоматически уязвим, поскольку для этого потребуется доступ к жесткому диску в целом. Если ваша операционная система поддерживает шифрование файлов, привязанных к профилю, используйте его - это может только помочь и обычно прозрачно (например, шифрование NTFS).
  4. Если возможно, храните сами ключи зашифрованными с помощью основного пароля. Обычно это означает ваше приложение. этот пароль потребуется ввести при запуске - нет смысла указывать его в параметре из сценария, поскольку, если ваш жесткий диск взломан, вы должны предполагать, что можно просмотреть как файл ключа, так и сценарий.
  5. Для каждого набора учетных данных сохраните соль (незашифрованный) вместе с зашифрованными данными; это используется для "начального" шифрования шифра таким образом, чтобы два идентичных пароля не давали одинаковый зашифрованный текст, поскольку это свидетельствует о том, что пароли совпадают.
  6. Если имя пользователя не требуется для поиска записи учетной записи (а в вашем случае это не так), зашифруйте имя пользователя и пароль. Если вы зашифруете оба, зашифруйте их как один запуск шифрования, например

    userAndPass = (пользователь + ":" + пароль);
    encryptInit ();
    зашифровать (соль);
    зашифровать (userAndPass);
    cipherText = encryptFinal ();

    и сохранить единичный BLOB-объект, чтобы было меньше коротких зашифрованных текстов, которые легче взломать, а имя пользователя дополнительно усваивает пароль.

PS: Я не программирую на PHP, поэтому не могу комментировать подходящие криптографические ПО в этой среде.

Как многие заявили, сценарий требует, чтобы вы зашифровали имя пользователя и пароль. Я бы порекомендовал вам проверить расширение mcrypt php для шифрования / дешифрования.

Я думаю, что собираюсь исследовать компиляцию PHP-скрипта со встроенными учетными данными на лету из веб-приложения.

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

Попробую использовать Roadsend. http://www.roadsend.com/

Просто чтобы продолжить предложение использовать функции кодирования и декодирования MySQL, руководство нечеткий о том, как они работают:

The strength of the encryption is based on how good the random generator is. It should suffice for short strings.

Но я бы посоветовал вместо этого использовать встроенный MySQL 5.0 Функции AES; AES_ENCRYPT() и AES_DECRYPT()

SELECT AES_ENCRYPT('secret squirrel', '12345678') AS encoded

=> ØA;J×ÍfOU»] É8

SELECT AES_DECRYPT('ØA;J×ÍfOU»] É8', '12345678') AS decoded

=> secret squirrel

Они используют 128-битный AES, который должен быть достаточно сильным для большинства целей. Как отмечали другие, использование значения соли и ключа с высокой энтропией является хорошей практикой.

Для PHP важно отметить, что шифрование AES является реализовано с помощью функций MCRYPT_RIJNDAEL. Не платите за закрытые реализации, если они доступны в PHP.

См. Страница PHP, обсуждающая доступные шифры для получения дополнительной информации.

Другие вопросы по теме