Как безопасно хранить пароль в MySQL и проверять подлинность внешних служб

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

MySQL поддерживает функцию AES_ENCRYPT () . Вы можете зашифровать, когда вы вставляете его в базу данных, и расшифровываете его, когда вы выбираете его обратно.

Прочтите документацию, к которой я привязан для примеров.

Затем убедитесь, что вы используете порт 993 для зашифрованного соединения TLS с сервером IMAP, когда вы imap_open () с паролем открытого текста.

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

Если вы можете отправить хешированный пароль серверу, используйте его хэш-функцию (md5, sha1, sha512, …).

hash('sha1', $password); sha1($password); // Same result as above. 

Если вам нужно зашифровать (чтобы иметь возможность расшифровать), вы можете использовать mcrypt или openssl.

http://php.net/manual/en/function.mcrypt-encrypt.php http://php.net//manual/en/function.openssl-encrypt.php

Разница здесь в том, что хешированный пароль нельзя разбить. Зашифрованный пароль может быть расшифрован.

Точка хеширования паролей заключается в обеспечении конфиденциальности и конфиденциальности для конечного пользователя в случае взлома базы данных. Очевидно, вы не можете использовать хеш-функции, потому что ваш скрипт должен прочитать пароль imap, чтобы вы зашифровали его с помощью некоторой симметричной функции криптографии (например, AES, blowfish, 3DES и т. Д.). Теперь вы столкнулись с проблемой хранения симметричного ключевого материала: сохранение его в той же базе данных совершенно неразумно, потому что взломать базу данных означало бы считывание ключа. Вы можете жестко закодировать ключевой материал внутри скрипта или внешнего txt-файла: теперь хакер должен скомпрометировать как сервер mysql, так и веб-домен для получения пароля imap, и это максимальный уровень безопасности, который вы можете достичь со стандартным php + домен общего назначения mysql.

Я использую эти функции или некоторые варианты их для входа. Он имеет тенденцию быть довольно безопасным, так как он объединяет пароли и хэширует их.

 <?php function password_encrypt($password) { // Tells PHP to use Blowfish with a "cost" of 10 $hash_format = "$2y$10$"; // Blowfish salts should be 22-characters or more $salt_length = 22; $salt = generate_salt($salt_length); $format_and_salt = $hash_format . $salt; $hash = crypt($password, $format_and_salt); return $hash; } function generate_salt($length) { // Not 100% unique, not 100% random, but good enough for a salt // MD5 returns 32 characters $unique_random_string = md5(uniqid(mt_rand(), true)); // Valid characters for a salt are [a-zA-Z0-9./] $base64_string = base64_encode($unique_random_string); // But not '+' which is valid in base64 encoding $modified_base64_string = str_replace('+', '.', $base64_string); // Truncate string to the correct length $salt = substr($modified_base64_string, 0, $length); return $salt; } function password_check($password, $existing_hash) { // existing hash contains format and salt at start $hash = crypt($password, $existing_hash); if ($hash === $existing_hash) { return true; } else { return false; } } function attempt_login($username, $password) { $admin = find_admin_by_username($username); if ($admin) { // found admin, now check password if (password_check($password, $admin["hashed_password"])) { // password matches return $admin; } else { // password does not match return false; } } else { // admin not found return false; } } ?>