PHP 7 – mcrypt устарела, нужна альтернатива

Объявление mcrypt-extension устарело, будет удалено в PHP 7.2 в соответствии с комментарием, размещенным здесь . Поэтому я ищу альтернативный способ шифрования паролей.

Прямо сейчас я использую sometihng как

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv) 

Мне нужно ваше мнение о наилучшем / сильном способе шифрования паролей, поэтому зашифрованный пароль должен поддерживаться PHP 7.xx, а также должен быть дешифруемым, потому что мои клиенты хотят иметь возможность «восстановить» свои пароли, не создавая новый.

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

Если вы должны зашифровать свои данные и сделать их дешифруемыми, руководство по защищенному шифрованию / расшифровке доступно по адресу https://paragonie.com/white-paper/2015-secure-php-data-encryption . Подводя итог этой ссылке:

  • Использовать Libsodium – расширение PHP
  • Если вы не можете использовать Libsodium, используйте defuse / php-encryption – Прямой PHP-код
  • Если вы не можете использовать Libsodium или defuse / php-encryption, используйте OpenSSL . Многие серверы уже установили это. Если нет, его можно скомпилировать с помощью –with-openssl [= DIR]

Вы можете использовать пакет pollyfill phpseclib. Вы не можете использовать открытый ssl или libsodium для шифрования / дешифрования с помощью rijndael 256. Еще одна проблема, вам не нужна замена какого-либо кода.

Вы должны использовать функцию openssl_encrypt ()

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

PHP предоставляет пару мощных функций для случайного, одностороннего хэш-шифрования – password_hash() и password_verify() . Поскольку хеш автоматически солености, хакеры не могут использовать предварительно скомпилированные таблицы хэшей паролей, чтобы перепроектировать пароль. Установите параметр PASSWORD_DEFAULT и будущие версии PHP автоматически будут использовать более сильные алгоритмы для генерации хэшей паролей без необходимости обновления кода.

Мне удалось перевести мой объект Crypto

  • Получите копию php с mcrypt для дешифрования старых данных. Я перешел на http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , скомпилировал его, затем добавил расширение ext / mcrypt (configure; make; make install). Думаю, мне пришлось добавить строку extenstion = mcrypt.so в php.ini. Серия скриптов для создания промежуточных версий данных со всеми незашифрованными данными.

  • Создайте открытый и закрытый ключ для openssl

     openssl genrsa -des3 -out pkey.pem 2048 (set a password) openssl rsa -in pkey.pem -out pkey-pub.pem -outform PEM -pubout 
  • Для шифрования (с использованием открытого ключа) используйте openssl_seal. Из того, что я прочитал, openssl_encrypt с использованием ключа RSA ограничен 11 байтами меньше длины ключа (см. Комментарий http://php.net/manual/en/function.openssl-public-encrypt.php Томаса Хорстена)

     $pubKey = openssl_get_publickey(file_get_contents('./pkey-pub.pem')); openssl_seal($pwd, $sealed, $ekeys, [ $pubKey ]); $encryptedPassword = base64_encode($sealed); $key = base64_encode($ekeys[0]); 

Возможно, вы сохранили исходный двоичный файл.

  • Чтобы расшифровать (используя закрытый ключ)

     $passphrase="passphrase here"; $privKey = openssl_get_privatekey(file_get_contents('./pkey.pem'), $passphrase); // I base64_decode() from my db columns openssl_open($encryptedPassword, $plain, $key, $privKey); echo "<h3>Password=$plain</h3>"; 

PS Вы не можете зашифровать пустую строку ("")