Двунаправленное шифрование в PHP

Мое приложение (очевидно) использует уникальный идентификатор, чтобы отличать записи. Этот UID передается в URL-адресах (например ./examplepage.php?UID=$example_int ), между прочим.

Хотя у меня, очевидно, есть проверка на стороне сервера, чтобы убедиться, что клиенты не получают доступа к данным других клиентов, существует ли способ двустороннего шифрования, который я могу использовать в PHP для передачи только зашифрованных UID (например ./examplepage.php?EUID=$encrypted_int ), чтобы еще больше уменьшить вероятность того, что кто-то подумает «эй, что произойдет, если я увеличиваю это целое число?»

ТИА.

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

В PHP 5.3 введен новый метод шифрования, который очень прост в использовании: openssl_encrypt и openssl_decrypt . Это не очень хорошо документировано, так что вот простой пример:

 $textToEncrypt = "My super secret information."; $encryptionMethod = "AES-256-CBC"; // AES is used by the US gov't to encrypt top secret documents. $secretHash = "25c6c7ff35b9979b151f2136cd13b0ff"; //To encrypt $encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash); //To Decrypt $decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash); //Result echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage"; 

Я выбрал 256-AES, потому что он прочный и быстрый. Правительство США приняло решение зашифровать секретные документы. Это быстро рассматривает машины и программное обеспечение. Вот список доступных методов шифрования:

AES-128-CBC, AES-128-CFB, AES-128-CFB1, AES-128-CFB8, AES-128-ECB, AES-128-OFB, AES-192-CBC, AES-192-CFB, AES- 192-CFB1, AES-192-CFB8, AES-192-ECB, AES-192-OFB, AES-256-CBC, AES-256-CFB, AES-256-CFB1, AES-256-CFB8, AES-256- ECB, AES-256-OFB, BF-CBC, BF-CFB, BF-ECB, BF-OFB, CAMELLIA-128-CBC, CAMELLIA-128-CFB, CAMELLIA-128-CFB1, CAMELLIA-128-CFB8, CAMELLIA- 128-ECB, CAMELLIA-128-OFB, CAMELLIA-192-CBC, CAMELLIA-192-CFB, CAMELLIA-192-CFB1, CAMELLIA-192-CFB8, CAMELLIA-192-ECB, CAMELLIA-192-OFB, CAMELLIA-256- CBC, CAMELLIA-256-CFB, CAMELLIA-256-CFB1, CAMELLIA-256-CFB8, CAMELLIA-256-ECB, CAMELLIA-256-OFB, CAST5-CBC, CAST5-CFB, CAST5-ECB, CAST5-OFB, DES- CBC, DES-CFB, DES-CFB1, DES-CFB8, DES-ECB, DES-EDE, DES-EDE-CBC, DES-EDE-CFB, DES-EDE-OFB, DES-EDE3, DES-EDE3-CBC, DES-EDE3-CFB, DES-EDE3-CFB1, DES-EDE3-CFB8, DES-EDE3-OFB, DES-OFB, DESX-CBC, RC2-40-CBC, RC2-64-CBC, RC2-CBC, RC2- CFB, RC2-ECB, RC2-OFB, RC4, RC4-40, SEED-CBC, SEED-CFB, SEED-ECB, SEED-OFB, aes-128-cbc, aes-128-cfb, aes-128-cfb1, AES-1 28-cfb8, aes-128-ecb, aes-128-bb, aes-192-cbc, aes-192-cfb, aes-192-cfb1, aes-192-cfb8, aes-192-ecb, aes-192- ofb, aes-256-cbc, aes-256-cfb, aes-256-cfb1, aes-256-cfb8, aes-256-ecb, aes-256-bb, bf-cbc, bf-cfb, bf-ecb, bf-ofb, камелия-128-cbc, камелия-128-cfb, камелия-128-cfb1, камелия-128-cfb8, камелия-128-экб, камелия-128-bb, камелия-192-cbc, камелия-192- cfb, камелия-192-cfb1, камелия-192-cfb8, камелия-192-экв, камелия-192-bb, камелия-256-cbc, камелия-256-cfb, камелия-256-cfb1, камелия-256-cfb8, camellia-256-ecb, камелия-256-bb, cast5-cbc, cast5-cfb, cast5-ecb, cast5-ofb, des-cbc, des-cfb, des-cfb1, des-cfb8, des-ecb, des- ede, des-ede-cbc, des-ede-cfb, des-ede-ofb, des-ede3, des-ede3-cbc, des-ede3-cfb, des-ede3-cfb1, des-ede3-cfb8, des- ede3-ofb, des-ofb, desx-cbc, rc2-40-cbc, rc2-64-cbc, rc2-cbc, rc2-cfb, rc2-ecb, rc2-ofb, rc4, rc4-40, seed-cbc, seed-cfb, seed-ecb, seed-ofb


ВАЖНОЕ ОБНОВЛЕНИЕ !!!

Спасибо Hobo и Jorwin за то, что в PHP 5.3.3> появился новый параметр, который делает эту функцию немного более безопасной.

Jorwin ссылается на эту ссылку в своем комментарии , и вот выдержка, которая применима:

В 5.3.3 они добавили новый параметр, string $iv (вектор инициализации). Реальные параметры: string openssl_encrypt ( string $data , string $method , string $password, bool $raw_output = false, string $iv )

Если $iv отсутствует, выдается предупреждение: «Использование пустого вектора инициализации (iv) потенциально небезопасно и не рекомендуется».

Если $iv слишком короткое, другое предупреждение: «Пропущенный IV имеет длину всего 3 байта, шифр ожидает IV точно 8 байтов, заполнение с помощью \ 0"

тот же IV должен использоваться в openssl_decrypt()

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

HMAC (по существу, хешированные ключами) являются одним из способов получения криптографической аутентичности. Сопоставьте UID с HMAC UID (PHP имеет реализацию HMAC ), используя ключ, который знает только сервер. В начале каждого запроса проверьте HMAC.

В принципе, используйте правильный инструмент для правильной работы.

Хотя PHP поддерживает много двухсторонних алгоритмов хэширования, я не вижу в этом примере полезности. Что вам нужно сделать:

  1. Загрузите строку из хранилища с помощью предоставленного идентификатора
  2. Убедитесь, что владелец строки является аутентифицированным пользователем и если не выбрасывает исключение и информирует пользователя, чтобы он не делал этого снова

Но если ваше сердце настроено на хэширование, просто выберите один из предложенных алгоритмов.

Для двухстороннего шифрования проверьте mcrypt , или если вы предпочитаете чистую реализацию phpseclib .

Во-первых, шифрование параметров URL-адресов, как правило, является плохой идеей , а отдельный поиск (основанный на столбце CHAR индекса, сгенерированный CSPRNG) лучше для 99,9% случаев использования.

С учетом сказанного: Да, вы можете использовать расширение OpenSSL ( не используйте mcrypt ) для шифрования данных, например, предложенных espradley , однако я бы предостерег вас не останавливаться на просто шифровании.

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

Таким образом, решение заключается в использовании аутентифицированного шифрования , к которому можно легко получить доступ с помощью libsodium, доступного на PECL .

Если вы не можете по какой-либо причине установить расширение PECL, на выбор могут быть две библиотеки PHP: defuse / php-encryption и zend-crypt . Они оба предлагают стандартизованное аутентифицированное шифрование, и оба они безопасны в использовании (для чего он стоит, я часто выполняю проверки кода для реализаций криптографии на PHP, я не просто случайный человек в Интернете).