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

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

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

ТИА.

Ответ 1

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

Ответ 2

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

$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC";  // AES is used by the U.S. 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, ae s-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-bb, 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-ое, камелия-192-cbc, камелия- 192-cfb, камелия-192-cfb1, камелия-192-cfb8, камелия-192-экб, камелия-192-bb, камелия-256-cbc, камелия-256-cfb, камелия-256-cfb1, камелия-256- cfb8, камелия-256-экв, камелия-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 -bbb, desx-cbc, rc2-40-cbc, rc2-64-cbc, rc2-cbc, rc2-cfb, rc2-ecb, rc2-ofb, rc4, rc4-40, 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()

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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