Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

Здесь, вероятно, есть хорошая информация:

http://phpsec.org/library/

Ответ 3

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

Ответ 4

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

Ответ 5

Один простой способ начать работу - использовать функции 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;

Ответ 6

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

Ответ 7

Думаю, ты на мишени. Посмотрите GPG за хорошую открытую библиотеку шифрования

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

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

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

Но я бы предположил, что вместо этого вы можете использовать встроенную функцию 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, которая должна быть достаточно сильной для большинства целей. Как отмечали другие, использование соли и ключа с высокой энтропией является хорошей практикой.

Ответ 12

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

Дополнительную информацию см. в странице PHP о доступных шифрах.