Nano Hash - криптовалюты, майнинг, программирование

Какой простой симметричный способ зашифровать строку и передать URL-адрес в php?

Как говорится в вопросе, мне нужен способ зашифровать строку (например, «x = 27 & y = 3 & z = 123456» в «hUIgBG5664y65H2UIB»), чтобы ее можно было передать через источник изображения html, например так:

<img src="returnpicture.php?stuff=hUIgBG5664y65H2UIB"/>

returnpicture.php расшифрует это обратно в «x=27&y=3&z=123456» и разберет на три переменные, которые будут использоваться для выбора изображения и его возврата.

Проблема в том, что куда бы я ни посмотрел, все, что я могу найти, это информация о хешировании и шифровании сверхчувствительной информации, такой как кредитные карты и пароли. Эта информация вообще не является конфиденциальной, я просто не хочу, чтобы пользователи могли вмешиваться в нее. Поэтому он не должен быть слишком длинным. Кроме того, шифрование (я предполагаю) должно быть буквенно-цифровым, чтобы не перепутать URL-адрес с & или =. Я делаю это в php.

Это для своего рода игры. Пользователь не должен иметь возможности возиться с переменными, потому что он увидит то, чего еще не должен.


  • Эта информация вообще не является конфиденциальной, я просто не хочу, чтобы пользователи могли вмешиваться в нее. Если она не является конфиденциальной, то какое вам дело до ее подделки? Если вас не волнует, смогут ли они его прочитать, но вам важно, чтобы они его модифицировали, загляните в HMAC. 17.12.2013
  • В приложении на нашем сайте мы просто используем для этого base64. 17.12.2013
  • Тогда используйте токен/одноразовый номер. Сохраните фактические числа в своей базе данных и выдайте случайный идентификатор. 17.12.2013
  • Если вы используете небуквенно-цифровое шифрование, просто оберните его urlencode(), чтобы справиться с этим. 17.12.2013
  • Зачем вам нужно шифрование в первую очередь? Почему бы не передать параметры как есть? 17.12.2013
  • stackoverflow.com/questions/9262109/ 17.12.2013

Ответы:


1

Для общего понимания

Когда вы включаете определенные пары ключ-значение в URL-адрес запроса, PHP загружает эти значения (соответственно) в файл $_GET superglobal.

?x=12&y=13

приведет к

$_GET['x'] // contains 12
$_GET['y'] // contains 13

Кажется, вы пытаетесь предоставить несколько пар ключ-значение в паре ключ-значение:

?stuff={more-key-value-pairs}

Просто имейте в виду, что PHP не будет интерпретировать пары ключ-значение в $_GET['stuff'].

Кодирование/декодирование

Примечание. Это одно из возможных решений. Найдите тот, который подходит вам больше всего, и примените его.

Вы можете использовать base64_encode() для кодирования и base64_decode() для его декодирования.

Пример:

echo '<img src="returnpicture.php?stuff=' . rawurlencode( base64_encode('x=27&y=3&z=123456') ) . '" />';  

Использование rawurlencode() обеспечивает правильное безопасное кодирование URL строки в кодировке base64.

В вашем returnpicture.php вы можете использовать:

$decodedString = base64_decode( $_GET['stuff'] );

чтобы вернуть исходную строку.

Однако, если вы на самом деле планируете отправить запрос на получение в виде строки (с присвоением переменных, таких как ?x=12&y=13 и т. д.), вам необходимо применить дополнительные методы для анализа этой строки.

Подробнее о том, как это можно сделать, см. в этом вопросе

17.12.2013
  • base64 не является шифрованием 17.12.2013
  • Ты прав. Учитывая название вопроса, я предполагаю, что ОП на самом деле ищет не шифрование, а способ замаскировать свои параметры; используя термин encryption из-за отсутствия лучшего слова. Может конечно ложное предположение. В любом случае предоставленное решение может по-прежнему удовлетворять его потребности, а если и нет, то, надеюсь, оно добавит общего понимания. 17.12.2013
  • Мне кажется, он просто ищет обфускацию, а не шифрование. Он сказал, что это не секретно, он просто не хочет, чтобы его легко подделывали. 17.12.2013

  • 2

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

    function scramble(key, text) {
        return encodeURIComponent(text.replace(/[^\0]/g, function(x, i) {
            var code = x.charCodeAt(0) ^ key.charCodeAt(i % key.length);
            return String.fromCharCode(code);
        }));
    }
    
    function descramble(key, text) {
        return decodeURIComponent(text).replace(/[^\0]/g, function(x, i) {
            var code = x.charCodeAt(0) ^ key.charCodeAt(i % key.length);
            return String.fromCharCode(code);
        });
    }
    

    Если вашим key является «секретный код», а вашим text является «x=27&y=3&z=123456», то scramble(key, text) возвращает «%0BXQEC%0D%5E%5CB%1FNTQAQAU».

    «Дескремблирование» этого результата с тем же key дает исходное text, «x=27&y=3&z=123456».

    Обратите внимание, что вы, вероятно, захотите сделать это на стороне PHP, код JavaScript приведен здесь только в качестве примера.

    http://jsfiddle.net/m92rc/

    17.12.2013

    3

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

    Подход 1. base64 кодировать

    <img src="returnpicture.php?stuff=<?php echo base64_encode('x=27&y=3&z=123456'); ?>"/>
    

    И получить это как:

    $data = base64_decode($_GET['stuff']);
    

    Подход 2. $_SESSION переменных

    Вы должны комбинировать $_GET с $_POST, не раскрывая важной информации, такой как:

    $postfix = uniqid(); // Generate an UNIQUE id
    $_SESSION['sensible_var1_'.$postfix] = "value";
    $_SESSION['sensible_var2_'.$postfix] = "value";
    $_SESSION['sensible_var3_'.$postfix] = "value";
    

    И вы можете передать эту информацию только с помощью:

    <img src="returnpicture.php?stuff=<?php echo $postfix; ?>"/>
    

    И в вашем файле returnpicture.php вы можете получить информацию как:

    $sensible_var1 = $_SESSION['sensible_var1_'.$_GET['stuff']];
    $sensible_var2 = $_SESSION['sensible_var2_'.$_GET['stuff']];
    $sensible_var3 = $_SESSION['sensible_var3_'.$_GET['stuff']];
    
    17.12.2013
  • Если на странице может быть несколько таких изображений, каждое с разными параметрами, как это будет работать? 17.12.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..