Расширение mcrypt устарело и будет удалено в PHP 7.2 в соответствии с опубликованным здесь комментарием . Поэтому я ищу альтернативный способ шифрования паролей.
Сейчас я использую что-то вроде
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)
Мне нужно ваше мнение о лучшем / самом надежном способе шифрования паролей, зашифрованный пароль, конечно, должен поддерживаться PHP 7.xx и также должен быть дешифруемым, потому что мои клиенты действительно хотят иметь возможность `` восстанавливать '' свои пароли без создания нового один.
password_hash
и не проверятьpassword_verify
?Ответы:
Лучше всего хешировать пароли, чтобы их нельзя было расшифровать. Это немного усложняет задачу злоумышленникам, которые могли получить доступ к вашей базе данных или файлам.
Если вам необходимо зашифровать свои данные и сделать их дешифруемыми, руководство по безопасному шифрованию / дешифрованию доступно по адресу https://paragonie.com/white-paper/2015-secure-php-data-encryption . Подводя итог этой ссылке:
источник
Sodium-compat
( github.com/paragonie/sodium_compat ), которая работает в PHP> = 5.2.4Как предлагает @rqLizard , вместо этого вы можете использовать функции
openssl_encrypt
/openssl_decrypt
PHP, которые предоставляют гораздо лучшую альтернативу для реализации AES (расширенного стандарта шифрования), также известного как шифрование Rijndael.Согласно следующему комментарию Скотта на php.net :
Дальнейшее чтение:
Примеры кода
Пример # 1
Пример # 2
Пример # 3
На основе приведенных выше примеров я изменил следующий код, который нацелен на шифрование идентификатора сеанса пользователя:
в:
Чтобы уточнить, вышеупомянутое изменение не является истинным преобразованием, поскольку два шифрования используют разный размер блока и разные зашифрованные данные. Кроме того, заполнение по умолчанию отличается,
MCRYPT_RIJNDAEL
поддерживается только нестандартное заполнение нулями. @zaphДополнительные примечания (из комментариев @ zaph):
MCRYPT_RIJNDAEL_128
) это эквивалентно AES , однако Rijndael 256 (MCRYPT_RIJNDAEL_256
) не AES-256 , как 256 определяет размер блока 256 бит, в то время как AES имеет только один размер блока: 128 бит. Итак, в основном Rijndael с размером блока 256 бит (MCRYPT_RIJNDAEL_256
) был ошибочно назван из-за выбора разработчиков mcrypt . @zaphШифрование с разными размерами блоков для Rijndael производит разные зашифрованные данные.
Например,
MCRYPT_RIJNDAEL_256
(не эквивалентноAES-256
) определяет другой вариант блочного шифра Rijndael с размером 256 бит и размером ключа на основе переданного ключа, гдеaes-256-cbc
Rijndael с размером блока 128 бит с размером ключа 256 бит. Поэтому они используют разные размеры блоков, которые создают совершенно разные зашифрованные данные, поскольку mcrypt использует число для указания размера блока, а OpenSSL использует число для указания размера ключа (AES имеет только один размер блока из 128 бит). Итак, в основном AES - это Rijndael с размером блока 128 бит и размером ключа 128, 192 и 256 бит. Поэтому лучше использовать AES, который в OpenSSL называется Rijndael 128.источник
$session_id = rtrim($decryptedSessionId, "\0");
? Можно лиopenssl_decrypt
в конце вернуть нежелательные символы? Что, если зашифрованная переменная оканчивается на 0 (т.е.encrypt("abc0")
?"\0"
- это не"0"
просто символ NULL, код ASCII которого равен 0x00 (шестнадцатеричный 0).Реализация Rijndael на чистом PHP существует с phpseclib, доступным как пакет composer, и работает на PHP 7.3 (проверено мной).
В документации phpseclib есть страница, которая генерирует образец кода после ввода основных переменных (шифр, режим, размер ключа, размер в битах). Он выводит следующее для Rijndael, ECB, 256, 256:
код с mycrypt
так работает с библиотекой
*
$term
былbase64_decoded
источник
Как подробно описано в других ответах здесь, лучшее решение, которое я нашел, - это использование OpenSSL. Он встроен в PHP, и вам не нужна внешняя библиотека. Вот простые примеры:
Чтобы зашифровать:
Чтобы расшифровать:
Справочная ссылка: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/
источник
Вы можете использовать пакет phpseclib pollyfill. Вы не можете использовать open ssl или libsodium для шифрования / дешифрования с помощью rijndael 256. Другая проблема, вам не нужно заменять какой-либо код.
источник
mcrypt_compat
, запустив,composer require phpseclib/mcrypt_compat
но все еще получаю,PHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124
что использую php7.2.26
и фреймворк Kohana. Есть ли какие-либо дополнительные действия после его установки с помощью композитора?require APPPATH . '/vendor/autoload.php';
в конецbootstrap.php
.Вам следует использовать OpenSSL,
mcrypt
поскольку он активно развивается и поддерживается. Это обеспечивает лучшую безопасность, удобство обслуживания и портативность. Во-вторых, он намного быстрее выполняет шифрование / дешифрование AES. По умолчанию он использует заполнение PKCS7, но вы можете указать,OPENSSL_ZERO_PADDING
если оно вам нужно. Для использования с 32-байтовым двоичным ключом вы можете указать,aes-256-cbc
что гораздо очевиднее, чемMCRYPT_RIJNDAEL_128
.Вот пример кода с использованием Mcrypt:
А вот версия, написанная с использованием OpenSSL:
Источник: Если вы вводите слово MCRYPT в свой PHP-код, значит, вы делаете это неправильно .
источник
Я использую это на PHP 7.2.x, у меня он отлично работает:
а затем аутентифицируйте хэш с помощью следующей функции:
Пример:
и для аутентификации этого хеша используйте следующий код:
Вот и все.
источник
Как уже отмечалось, вы не должны хранить пароли своих пользователей в расшифровываемом формате. Обратимое шифрование предоставляет хакерам простой способ узнать пароли ваших пользователей, что распространяется на подвергание опасности учетных записей ваших пользователей на других сайтах, если они будут использовать там тот же пароль.
PHP предоставляет пару мощных функций для одностороннего хэш-шифрования со случайной солью -
password_hash()
иpassword_verify()
. Поскольку хэш автоматически получает случайное значение, хакеры не могут использовать предварительно скомпилированные таблицы хешей паролей для обратного проектирования пароля. Установите этотPASSWORD_DEFAULT
параметр, и будущие версии PHP будут автоматически использовать более надежные алгоритмы для генерации хэшей паролей без необходимости обновления кода.источник
Вам следует использовать
openssl_encrypt()
функцию.источник
Мне удалось перевести свой объект Crypto
Получите копию php с помощью mcrypt, чтобы расшифровать старые данные. Я зашел на http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , скомпилировал его, а затем добавил расширение ext / mcrypt (configure; make; make install). Думаю, мне также пришлось добавить строку extension = mcrypt.so в php.ini. Серия скриптов для создания промежуточных версий данных с незашифрованными данными.
Создайте открытый и закрытый ключи для openssl
Для шифрования (с использованием открытого ключа) используйте openssl_seal. Из того, что я читал, openssl_encrypt с использованием ключа RSA ограничен на 11 байтов меньше длины ключа (см. Http://php.net/manual/en/function.openssl-public-encrypt.php комментарий Томаса Хорстена)
Вероятно, вы могли бы сохранить необработанный двоичный файл.
Расшифровать (используя закрытый ключ)
PS Нельзя зашифровать пустую строку ("")
PPS Это для базы данных паролей, а не для проверки пользователем.
источник