Простое двустороннее шифрование для создания зашифрованного ключа без специальных символов - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть простой двусторонний метод шифрования, который генерирует зашифрованную строку. Метод приведен ниже: -

public function cryption($string, $action = 'e') 
{
    $secret_key     = 'secret-key';
    $secret_iv  = 'secret_iv';

    $output         = false;
    $encrypt_method = "AES-256-CBC";
    $key            = hash( 'sha256', $secret_key );
    $iv             = substr( hash( 'sha256', $secret_iv ), 0, 16 );

    if( $action == 'e' ){
        $output     = openssl_encrypt( $string, $encrypt_method, $key, 0, $iv );
    }else if( $action == 'd' ){
        $output     = openssl_decrypt( $string, $encrypt_method, $key, 0, $iv );
    }
    return $output;
}

Проблема в том, что он создает такую ​​строку:

yTJbtH7mIJjhY+SatnTxY5i2jt/qUW+nZgmGBeBgZEzpy2GMSBQgDjKeyjxGOdJd

Такие зашифрованные ключи имеют символы типа / & +. Мне нужно простое двустороннее шифрование, которое могло бы генерировать строку, состоящую только из буквенно-цифровых символов.

Примечание. Эта строка будет отправлена ​​в качестве параметра в метод контроллера codeigniter. Наличие косой черты означает, что часть строки после косой черты будет рассматриваться как отдельный параметр.

1 Ответ

0 голосов
/ 02 сентября 2018

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

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

Итак, давайте предположим, что символ + является единственным запрещенным символом и что ваши криптографические функции вывели строку ab+cyk; это будет значение $output в вашем коде.

Теперь давайте определим следующую замену последовательности символов:

+ <-> ya

т.е. Вы выполняете дальнейшую обработку $output перед отправкой, где + заменяется на ya. Таким образом, вы удалили все + символов из $ output.

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

Теперь мы почти у цели, но у нас осталась одна проблема. В настоящее время получатель (контроллер) не может различить, действительно ли последовательность символов ya в полученной строке действительно означает ya или если она означает +.

Мы можем решить эту проблему, если определим другую замену, которая должна применяться отправителем и получателем:

y <-> yy

Теперь последовательность символов ya при обнаружении контроллером в полученной строке будет однозначной. Это будет означать +, потому что исходная последовательность ya будет экранирована (закодирована) как yya.

Возвращаясь к нашему упрощенному примеру, строка ab+cyk станет abyacyyk на стороне отправителя и может быть однозначно декодирована получателем (контроллером).

Этот принцип (с вариациями) применялся в бесчисленных стандартах и ​​ситуациях при разработке программного обеспечения. Самыми известными, которые сразу приходят мне в голову, являются C (где обратная косая черта имеет особое значение в строковых константах, поэтому обратная косая черта - это escape-символ ) и экранирование URI (где знак процента - это escape характер).

Конечно, в нашем примере символ y является escape-символом. Обратите внимание, что нам не рекомендуется удваивать символ escape, если мы хотим получить его буквально; это просто случайный (хотя и частый) выбор. В нашем примере мы могли бы избежать y на yz или что-то еще вместо yy.

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

Но, в конце концов, решение уже существует: если вы можете принимать знаки процента (%) в строке, которую отправитель отправляет получателю (контроллеру), вы можете просто использовать экранирование URI.

Ключевым моментом здесь является то, что каждый из известных мне (скриптовых) языков имеет модули или даже основные функции, которые обеспечивают экранирование и удаление URI (также называемые кодированием и декодированием URI) надежно, удобно и (наконец, но не в последнюю очередь) эффективно. В большинстве случаев вы даже можете сказать тем модулям / функциям, какие символы вы хотели бы избежать, а какие нет, если вы хотите отклониться от обычных наборов символов.

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

Например, если бы мы кодировали и декодировали, как описано выше, размер нашей строки удваивался бы при кодировании, если бы он содержал только + и y символов. Если бы мы применили кодировку URI, размер строки даже можно было бы утроить (поскольку экранируемый символ будет заменен знаком процента плюс шестнадцатеричный код символа, т. Е. A будет заменен, например, %41 (если A будет в наборе символов, подлежащем замене)).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...