Я пытаюсь зашифровать пароль с помощью mcrypt_encrypt()
, Работает нормально на localhost
, но когда выходит в онлайн, мой вывод ""
и я получаю это предупреждение:
Предупреждение: mcrypt_encrypt (): ключ размера 10 не поддерживается
этот алгоритм. Поддерживаются только ключи размером 16, 24 или 32
Это код, который я использую:
$text="thisismypassword123";
$salt="1234567824";
return trim (
base64_encode (
mcrypt_encrypt (
MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv (
mcrypt_get_iv_size (
MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
)
)
);
Что может быть причиной этого и что я могу сделать, чтобы это исправить?
Я пытаюсь зашифровать пароль
Это наверное ошибка. Тот факт, что вы называете ключ «солью», делает меня еще более осторожным. Нужно хранить пароли пользователей? шифрование является НЕ правильный инструмент для работы. Хеширование пароля является. Они дико разные понятия.
Но давайте проигнорируем аспект «неправильный инструмент для работы» и предположим, что по какой-то причине вы шифровали строки без пароля. Даже в этом случае ваш код шифрования небезопасен.
return trim ( // Why are you trimming this? base64_encode ( mcrypt_encrypt ( MCRYPT_RIJNDAEL_256, // Not AES $salt, $text, MCRYPT_MODE_ECB, // The WORST mode possible mcrypt_create_iv ( // ECB mode doesn't use an IV mcrypt_get_iv_size ( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB ), MCRYPT_RAND // Even if an IV was used, MCRYPT_RAND // is a bad choice! Use MCRYPT_DEV_URANDOM ) ) ) );
Даже если вы исправили вышеуказанные проблемы, у вас есть более серьезная проблема: Избранные зашифрованные атаки.
Решение:
Подскажите, пожалуйста, кто дал вам фрагмент кода, что они распространяют небезопасный код по Интернету? Благодарю.
Что неясно в предупреждении? Предоставьте ключ приемлемого размера.
Ключ — это то, что вы назвали $ salt, это не соль, это ключ шифрования. Переименуйте его, чтобы сделать код более понятным.
Некоторые экземпляры могут добавлять байты заполнения к ключу, но это нестандартно и может отличаться для разных реализаций. Не доверяйте заполнению параметров, указывайте полную длину.
Также из зашифрованных документов:
MCRYPT_RIJNDAEL_256 — это не AES-256, это другой вариант блочного шифра Rijndael. Если вы хотите AES-256 в mcrypt, вы должны использовать MCRYPT_RIJNDAEL_128 с 32-байтовым ключом.
Вы должны использовать опции AES.
Код использует режим ECB, который не является безопасным, не должен использоваться и не использует IV. Вероятно, вы хотите использовать режим CBC, который требует IV. Тот же IV будет необходим для расшифровки.
Там не должно быть необходимости trim
Кодировка Base64.
Наконец, вложение нескольких уровней функций (6 здесь) может показаться хорошей идеей, но делает отладку практически невозможной, поскольку промежуточные результаты не могут быть проверены.
Тогда есть mcrypt
Лучше не использовать mcrypt, это заброшенное программное обеспечение, оно не обновлялось годами и не поддерживает стандартное заполнение PKCS # 7, только нестандартное заполнение нулями, которое нельзя использовать даже с двоичными данными. Вместо этого рассмотрите возможность использования разрядить, это поддерживается и правильно.
Простой способ решить проблему обратной совместимости — заполнить текущий пароль \ 0.
Например, для вашего текущего $ key = «1234567890» в PHP 5.4, поскольку текущий размер ключа равен 10, он перестанет работать в версии PHP 5.6.
Чтобы решить это без какого-либо влияния на приложение, просто измените на $ key = «1234567890 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0» (пока не достигнете 16 или же 32,…)
В PHP 5.6 и выше ваш $salt
должна быть случайная строка, которая 16, 24 или 32 символа. Ваш localhost, вероятно, все еще использует более старую версию PHP.
Этот код должен работать как на локальном хосте, так и на вашем сервере:
$text="thisismypassword123";
$salt="ddv21sd5dv56sd51"; // <- 16 characters long
return trim (
base64_encode (
mcrypt_encrypt (
MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv (
mcrypt_get_iv_size (
MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
)
)
);
Хотя этот код Работа, Есть еще другие вопросы, которые вы можете рассмотреть.
Смотрите другие ответы (в частности, Скотт Аркишевскийответ) для подробностей о том, что еще не так с вашим кодом и почему ты даже не должен использовать mcrypt_encrypt()
на первом месте!