Во-первых, чтобы заявить (надеюсь) очевидное, если вы можете каким-либо образом избежать хранения имен пользователей и паролей, сделайте это; это большая ответственность, и если ваш хранилище учетных данных будет взломано, оно может предоставить доступ ко многим другим местам для тех же пользователей (из-за совместного использования пароля).
Во-вторых, если вы должны хранить учетные данные, то предпочтительнее хранимых паролей с использованием необратимого, соленого криптографического хэша, поэтому, если ваши данные скомпрометированы, пароли не могут быть легко восстановлены и нет необходимости хранить ключ дешифрования вообще .
Если вам необходимо хранить расшифрованные учетные данные:
- Выберите хороший алгоритм шифрования - AES-256, 3DES (от даты) или шифр с открытым ключом (хотя я думаю, что это не нужно для этого использования). Используйте криптографическое программное обеспечение из авторитетного заслуживающего доверия источника - НЕ ПЫТАЙТЕСЬ СДЕЛАТЬ СВОЮ СОБСТВЕННОСТЬ, ВЫ, ПОДОБНО, ПОЛУЧИТЕ ЭТО НЕПРАВИЛЬНО.
- Используйте генератор случайных чисел secure для генерации ваших ключей. Слабая случайность - это причина номер один ошибок шифрования, а не алгоритмов шифрования.
- Храните ключи шифрования / дешифрования отдельно от базы данных в защищенном файле O / S, доступном только для профиля времени выполнения ваших приложений. Таким образом, если ваша БД взломана (например, путем внедрения SQL-кода), ваш ключ не будет автоматически уязвим, так как для этого потребуется доступ к жесткому диску в целом. Если ваша операционная система поддерживает шифрование файлов, привязанное к профилю, используйте его - это может помочь только в общих чертах (например, шифрование NTFS).
- Если возможно, храните сами ключи в зашифрованном виде с помощью основного пароля. Обычно это означает ваше приложение. этот пароль потребуется вводить при запуске - бесполезно указывать его в параметре из скрипта, поскольку, если ваш жесткий диск взломан, вы должны предполагать, что и файл ключа, и скрипт могут быть просмотрены.
- Для каждого набора учетных данных сохраните соль (в незашифрованном виде) вместе с зашифрованными данными; это используется для «заправки» шифровального шифра таким образом, что два идентичных пароля не выдают одинаковый текст шифра - поскольку это дает возможность идентифицировать пароли одинаковыми.
Если имя пользователя не нужно для поиска записи учетной записи (что в вашем случае не так), зашифруйте как имя пользователя, так и пароль. Если вы шифруете оба, шифруйте их как один прогон шифрования, например,
userAndPass = (пользовательское + ":" + пас);
encryptInit (); * +1026 *
шифровать (соль);
шифровать (userAndPass);
зашифрованный текст = encryptFinal ();
и сохраните единственный блоб, чтобы меньше встречалось коротких зашифрованных текстов, которые легче взломать, а имя пользователя еще больше заполняет пароль.
PS: я не программирую на PHP, поэтому не могу комментировать подходящие крипто-программы в этой среде.