GOOGLE ADS

пятница, 15 апреля 2022 г.

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

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

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

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

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


Решение проблемы

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

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

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

  • Выберите хороший алгоритм шифрования — AES-256, 3DES (устаревший) или шифр с открытым ключом (хотя я думаю, что это не нужно для этого использования). Используйте криптографическое программное обеспечение из авторитетного и надежного источника — НЕ ПЫТАЙТЕСЬ СБРОСИТЬ СВОЕ, ВЕРОЯТНО, ВЫ ПОЛУЧИТЕ ЭТО НЕПРАВИЛЬНО.

  • Используйте безопасный генератор случайных чисел для генерации ключей. Слабая случайность — это причина номер один сбоев безопасности, связанных с шифрованием, а не алгоритмы шифрования.

  • Храните ключ(и) шифрования/дешифрования отдельно от вашей базы данных в защищенном файле операционной системы, доступном только для вашего профиля среды выполнения приложений. Таким образом, если ваша БД взломана (например, посредством SQL-инъекции), ваш ключ автоматически не становится уязвимым, поскольку для этого потребуется доступ к жесткому диску в целом. Если ваша операционная система поддерживает шифрование файлов, привязанное к профилю, используйте его - это может только помочь и в целом прозрачно (например, шифрование NTFS).

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

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

  • Если имя пользователя не требуется для поиска записи учетной записи (что в вашем случае не требуется), зашифруйте и имя пользователя, и пароль. Если вы шифруете оба, зашифруйте их как один запуск шифрования, например

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

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


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

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...