Я имею в виду:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Может быть что-то вроде:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- В PHP, как вы можете это сделать?
Попытка использовать Crypt_Blowfish
, но это не сработало для меня.
Ответы:
Прежде чем что-то делать дальше, постарайтесь понять разницу между шифрованием и аутентификацией , и почему вы, вероятно, хотите использовать аутентифицированное шифрование, а не просто шифрование .
Чтобы реализовать аутентифицированное шифрование, вы хотите зашифровать, а затем MAC. Порядок шифрования и аутентификации очень важен! Один из существующих ответов на этот вопрос сделал эту ошибку; как и многие криптографические библиотеки, написанные на PHP.
Вам следует избегать реализации собственной криптографии и использовать безопасную библиотеку, написанную и проверенную экспертами по криптографии.
Используйте libsodium, если у вас есть доступ к PECL ( илиodium_compat, если вы хотите использовать libsodium без PECL); в противном случае ...
используйте defuse / php-encryption ; не катите свою собственную криптографию!
Обе библиотеки, указанные выше, позволяют легко и безболезненно внедрить аутентифицированное шифрование в ваши собственные библиотеки.
Если вы все еще хотите написать и развернуть свою собственную библиотеку криптографии, вопреки общепринятому мнению каждого криптографического эксперта в Интернете, вам следует предпринять следующие шаги.
Шифрование:
Дешифрирование:
hash_equals()
. Если это не удается, прервать.Другие вопросы дизайна:
mb_strlen()
иmb_substr()
, используя'8bit'
режим набора символов, чтобы предотвратитьmbstring.func_overload
проблемы.mcrypt_create_iv()
, НЕ ИСПОЛЬЗУЙТЕMCRYPT_RAND
!bin2hex()
,base64_encode()
И т.д. может произойти утечка информации о ваших ключей шифрования с помощью синхронизации кэша. Избегайте их, если это возможно.Даже если вы будете следовать советам, данным здесь, многое может пойти не так с криптографией. Всегда имейте криптографического эксперта, проверяющего вашу реализацию. Если вам не повезло дружить со студентом-криптографом в вашем местном университете, вы всегда можете обратиться за советом на форум по обмену стеками криптографии .
Если вам нужен профессиональный анализ вашей реализации, вы всегда можете нанять уважаемую команду консультантов по безопасности для проверки вашего криптографического кода PHP (раскрытие: мой работодатель).
Важно: когда не следует использовать шифрование
Не шифруйте пароли . Вместо этоговы хотите их хешировать , используя один из следующих алгоритмов хеширования паролей:
Никогда не используйте универсальную хеш-функцию (MD5, SHA256) для хранения пароля.
Не шифруйте параметры URL . Это неподходящий инструмент для работы.
Пример строкового шифрования PHP с помощью Libsodium
Если вы используете PHP <7.2 или у вас нет установленной библиотеки libsodium, вы можете использовать натрия_компат для достижения того же результата (хотя и медленнее).
Затем, чтобы проверить это:
Halite - Libsodium Made Easy
Одним из проектов, над которым я работаю, является библиотека шифрования Halite , цель которой - сделать libsodium более простым и интуитивно понятным.
Вся криптография лежит в основе libsodium.
Пример с defuse / php-шифрованием
Примечание :
Crypto::encrypt()
возвращает шестнадцатеричный код.Управление ключами шифрования
Если у вас возникнет желание использовать «пароль», остановитесь прямо сейчас. Вам нужен случайный 128-битный ключ шифрования, а не запоминающийся пароль.
Вы можете хранить ключ шифрования для долгосрочного использования следующим образом:
И, по запросу, вы можете получить его так:
Я настоятельно рекомендую просто хранить случайно сгенерированный ключ для долгосрочного использования вместо любого пароля в качестве ключа (или для получения ключа).
Если вы используете библиотеку Defuse:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
«Но я действительно хочу использовать пароль».
Это плохая идея, но хорошо, вот как это сделать безопасно.
Сначала сгенерируйте случайный ключ и сохраните его в константе.
Обратите внимание, что вы добавляете дополнительную работу и можете просто использовать эту константу в качестве ключа и избавить себя от душевных страданий!
Затем используйте PBKDF2 (например, так), чтобы получить подходящий ключ шифрования из вашего пароля, а не шифровать его напрямую.
Не просто используйте 16-значный пароль. Ваш ключ шифрования будет комично взломан.
источник
password_hash()
и проверяйте ихpassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Я опаздываю на вечеринку, но в поисках правильного способа сделать это я наткнулся на эту страницу, она была одной из самых популярных результатов поиска в Google, поэтому я хотел бы поделиться своим взглядом на проблему, которую я считаю актуальный на момент написания этого поста (начало 2017 года). Начиная с PHP 7.1.0,
mcrypt_decrypt
иmcrypt_encrypt
будет устаревшим, поэтому для построения будущего кода следует использовать openssl_encrypt и openssl_decryptВы можете сделать что-то вроде:
Вы также можете использовать любые другие методы рубки, в зависимости от ваших потребностей безопасности. Чтобы узнать о доступных методах дробилки, см. Функцию openssl_get_cipher_methods .
источник
prod_id=123
но я просто не хочу делать 123 читабельным для всех, однако даже если они смогут его прочитать, это не будет проблемой. Злоумышленник, способный заменить 123 на пользовательское значение, не причинит никакого вреда, он / она сможет получить информацию только о любом другом продукте, но обычный пользователь Joe не будет иметь понятия о том, как получить информацию для продукт 124, например. Для такого сценария это идеальное решение, а для безопасности - нет!Что не делать
Я получил это на себе. На самом деле я нашел ответ на Google и просто изменил что-то. Результат совершенно небезопасен однако.
источник
base64_encode(encrypt($string))
- Для расшифровки:decrypt(base64_decode($encrypted))
mcrypt_encrypt
заменив образец кода : php.net/manual/en/function.mcrypt-encrypt.php . Обратите внимание, что при рассмотрении этого вопроса в конце он, вероятно, должен иметьrtrim
символ for"\0"
.Для рамок Laravel
Если вы используете каркас Laravel, то его легче зашифровать и расшифровать с помощью внутренних функций.
источник
обновленный
PHP 7 готовая версия. Он использует функцию openssl_encrypt из библиотеки PHP OpenSSL .
источник
Я оставил этот ответ в исторических целях - но некоторые методы в настоящее время устарели, метод шифрования DES не рекомендуется и т. Д.
Я не обновлял этот код по двум причинам: 1) я больше не работаю с методами шифрования вручную в PHP, и 2) этот код по-прежнему служит той цели, для которой он предназначен: продемонстрировать минимальную, упрощенную концепцию работы шифрования в PHP.
Если вы найдете такой же упрощенный источник «PHP-шифрование для чайников», который может заставить людей начинать с 10-20 строк кода или меньше, дайте мне знать в комментариях.
Кроме того, пожалуйста, наслаждайтесь этим Классическим Эпизодом раннего эры ответа минималистичного шифрования PHP4.
В идеале у вас есть - или вы можете получить - доступ к библиотеке PHP mcrypt, так как она, безусловно, популярна и очень полезна для самых разных задач. Вот краткий обзор различных видов шифрования и некоторых примеров кода: Методы шифрования в PHP
Несколько предупреждений:
1) Никогда не используйте обратимое или «симметричное» шифрование, когда подходит односторонний хэш.
2) Если данные действительно конфиденциальны, например, номера кредитных карт или социального страхования, остановитесь; вам нужно больше, чем предоставляет любой простой кусок кода, но вам нужна криптографическая библиотека, разработанная для этой цели, и значительное количество времени для исследования необходимых методов. Кроме того, программная криптография, вероятно, обеспечивает <10% безопасности конфиденциальных данных. Это все равно, что перемонтировать атомную электростанцию - признать, что задача опасная и сложная, и вы не знаете, если это так. Финансовые штрафы могут быть огромными, поэтому лучше воспользоваться услугой и отчитаться за них.
3) Любое легко реализуемое шифрование, как указано здесь, может разумно защитить умеренно важную информацию, которую вы хотите сохранить от посторонних глаз, или ограничить воздействие в случае случайной / преднамеренной утечки. Но, видя, как ключ хранится в виде простого текста на веб-сервере, если они могут получить данные, они могут получить ключ дешифрования.
Как бы то ни было, получайте удовольствие :)
источник
M�������f=�_=
странные символы как зашифрованные. Разве я не могу получить простые символы? Как:2a2ffa8f13220befbe30819047e23b2c
. Кроме того, я не могу изменить ДЛИНУ$key_value
(фиксированную на 8 ???) и ДЛИНУ выхода$encrypted_text
? (не может ли это быть 32 или 64 или больше или больше?)MCRYPT_RIJNDAEL_128
), и шифротексты должны быть аутентифицированы (hash_hmac()
проверены сhash_equals()
).Если вы не хотите использовать библиотеку (что следует), используйте что-то вроде этого (PHP 7):
источник
define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Это компактные методы для шифрования / дешифрования строк с помощью PHP с использованием AES256 CBC :
Использование:
источник
Ниже код работает в php для всей строки со специальным символом
источник