Хранение паролей в обратимой форме
У меня есть приложение PHP, которое должно запускать скрипты bash, и предоставлять имя пользователя и пароль (для удаленных систем).
Мне нужно сохранить эти учетные данные где-нибудь, доступным моим PHP (сетевым) приложением.
Логическим местом является база данных (в настоящее время MySQL, но будет агностикой).
Проблема со "стандартным" способом хэширования и хранения учетных данных заключается в том, что она не обратима. Я должен иметь возможность получать учетные данные как незашифрованный текст, чтобы вставлять данные в сценарии bash.
Есть ли у кого-нибудь предложения по безопасному способу этого?
Я подумал, может быть, PKI'у учетных данных и сохранить результат в БД. Затем используйте закрытый ключ для unencrypt (PHP может это сделать). Сохраните скрипты, чтобы сделать это за пределами веб-корня.
Любые мысли очень ценятся.
Ответы
Ответ 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 о доступных шифрах.