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






Вам нужно будет изучить хорошие двухсторонние криптографические методы, и мое общее практическое правило:
Итак, найдите хорошую реализацию, которая хорошо проверена, и используйте ее.
Здесь, вероятно, есть полезная информация:
Извините, не могли бы вы высказаться. Я пропустил это.
Очевидно, есть немного (очень небольшое количество) людей, способных реализовать криптографический код, но вы бы знали, были ли вы одним из них! [Ну ... наверное, есть люди, которые ошибочно полагают, что они одни из этих людей, но все же ...]
Проверьте эту библиотеку: 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;
Вы неправильно употребляете термин «соль». Я думаю, вы имеете в виду "ключ"
Я бы посоветовал вам не хранить пароли, а использовать беспарольное ssh-соединение от хоста к удаленной системе, сгенерировав ssh-ключ и сохранив ваш открытый ключ в файле authorized_keys удаленной системы. Тогда вам нужно будет только установить соединение во время настройки. По общему признанию, не совсем отвечаю на ваш вопрос, но хранение паролей в обратимой форме - это скользкая дорожка к нарушению безопасности imho, хотя я уверен, что более умные мозги, чем мой, могут сделать это безопасным.
Во-первых, чтобы заявить (надеюсь) очевидное, если вы вообще можете каким-либо образом избежать хранения имен пользователей и паролей, сделайте это; это большая ответственность, и если ваше хранилище учетных данных будет взломано, оно может предоставить доступ ко многим другим местам для тех же пользователей (из-за совместного использования пароля).
Во-вторых, если вы должны хранить учетные данные, предпочтительнее хранить пароли, используя необратимый криптографический хэш с соленой солью, поэтому, если ваши данные скомпрометированы, пароли не могут быть легко реконструированы, и нет необходимости хранить ключ дешифрования вообще.
Если вы должны хранить расшифровываемые учетные данные:
Если имя пользователя не требуется для поиска записи учетной записи (а в вашем случае это не так), зашифруйте имя пользователя и пароль. Если вы зашифруете оба, зашифруйте их как один запуск шифрования, например
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, обсуждающая доступные шифры для получения дополнительной информации.
Как насчет изменения заголовка на «Лучшие методы хранения зашифрованных данных, которые необходимо расшифровать»? поскольку это не относится к паролям?