Какой самый простой способ сделать двустороннее шифрование в обычных установках PHP?
Мне нужно иметь возможность шифровать данные строковым ключом и использовать тот же ключ для расшифровки на другом конце.
Безопасность не так важна, как переносимость кода, поэтому я бы хотел, чтобы все было максимально просто. В настоящее время я использую реализацию RC4, но если я смогу найти что-то изначально поддерживаемое, я думаю, что я могу сохранить много ненужного кода.
php
security
encryption
cryptography
encryption-symmetric
user1206970
источник
источник
Sodium::crypto_secretbox()
иSodium::crypto_secretbox_open()
безопасны и производительны.Ответы:
Отредактировано:
Вы действительно должны использовать openssl_encrypt () & openssl_decrypt ()
Как говорит Скотт , Mcrypt не очень хорошая идея, поскольку она не обновлялась с 2007 года.
Существует даже RFC для удаления Mcrypt из PHP - https://wiki.php.net/rfc/mcrypt-viking-funeral
источник
Важно : Если у вас есть очень конкретный сценарий использования, не шифруют пароли , использовать алгоритм хэширования паролей вместо этого. Когда кто-то говорит, что он шифрует свои пароли в серверном приложении, он либо не информирован, либо описывает опасный дизайн системы. Безопасное хранение паролей является совершенно отдельной проблемой от шифрования.
Быть информированным. Проектирование безопасных систем.
Портативное шифрование данных в PHP
Если вы используете PHP 5.4 или новее и не хотите самостоятельно писать модуль криптографии, я рекомендую использовать существующую библиотеку, которая обеспечивает аутентифицированное шифрование . Библиотека, на которую я ссылаюсь, опирается только на то, что предоставляет PHP, и периодически проверяется горсткой исследователей безопасности. (Я в том числе.)
Если ваши цели портативности не помешают требующему расширение PECL, libsodium является высоко рекомендуется над чем вы или я могу написать в PHP.
Обновление (2016-06-12): Теперь вы можете использовать sodium_compat и использовать одни и те же криптографические предложения libsodium без установки расширений PECL.
Если вы хотите попробовать себя в криптографии, читайте дальше.
Во-первых, вы должны потратить время на изучение опасностей неаутентифицированного шифрования и принципа криптографической гибели .
Шифрование и дешифрование
Шифрование в PHP на самом деле простое (мы собираемся его использовать,
openssl_encrypt()
и какopenssl_decrypt()
только вы примете некоторые решения о том, как зашифровать вашу информацию. Обратитесьopenssl_get_cipher_methods()
к списку методов, поддерживаемых в вашей системе. Лучший выбор - AES в режиме CTR :aes-128-ctr
aes-192-ctr
aes-256-ctr
В настоящее время нет оснований полагать, что размер ключа AES является серьезной проблемой, о которой нужно беспокоиться (чем больше, тем лучше - не из-за плохого планирования ключей в 256-битном режиме).
Примечание: мы не используем
mcrypt
его, потому что он заброшен и содержит исправленные ошибки, которые могут повлиять на безопасность. По этим причинам я призываю других разработчиков PHP также избегать этого.Simple Encryption / Decryption Wrapper с использованием OpenSSL
Пример использования
Демо : https://3v4l.org/jl7qR
Вышеупомянутая простая криптографическая библиотека все еще не безопасна для использования. Нам нужно аутентифицировать шифротексты и проверять их, прежде чем мы расшифруем .
Примечание . По умолчанию
UnsafeCrypto::encrypt()
возвращается необработанная двоичная строка. Назовите это так, если вам нужно сохранить его в бинарно-безопасном формате (в кодировке base64):Демо : http://3v4l.org/f5K93
Оболочка простой аутентификации
Пример использования
Демонстрации : сырой двоичный файл , закодированный в base64
Если кто-то захочет использовать эту
SaferCrypto
библиотеку в производственной среде или в вашей собственной реализации тех же концепций, я настоятельно рекомендую обратиться к вашим резидентам-криптографам за вторым мнением. Они смогут рассказать вам об ошибках, о которых я даже не подозреваю.Вы будете намного лучше, используя авторитетную криптографическую библиотеку .
источник
Используйте
mcrypt_encrypt()
иmcrypt_decrypt()
с соответствующими параметрами. Действительно легко и просто, и вы используете проверенный в бою пакет шифрования.РЕДАКТИРОВАТЬ
Через 5 лет и 4 месяца после этого ответа
mcrypt
расширение находится в процессе устаревания и возможного удаления из PHP.источник
PHP 7.2 полностью отошел
Mcrypt
и шифрование теперь основано на поддерживаемойLibsodium
библиотеке.Все ваши потребности в шифровании могут быть в основном решены с помощью
Libsodium
библиотеки.Документация по Libsodium: https://github.com/paragonie/pecl-libsodium-doc
источник
crypto_sign
API делает не шифровать сообщения - это потребует одна изcrypto_aead_*_encrypt
функций.ВАЖНО этот ответ действителен только для PHP 5, в PHP 7 используются встроенные криптографические функции.
Вот простая, но достаточно безопасная реализация:
Код и примеры здесь: https://stackoverflow.com/a/19445173/1387163
источник