PHP Custom двустороннее шифрование и дешифрование, что я делаю не так?

Я пытаюсь запутать / зашифровать число в строку, а затем снова хочу де-ubfuscate/ расшифровать эту строку, чтобы получить номер.

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

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

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

<?php
$base_encryption_array = array(
'0'=>'b76',
'1'=>'d75',
'2'=>'f74',
'3'=>'h73',
'4'=>'j72',
'5'=>'l71',
'6'=>'n70',
'7'=>'p69',
'8'=>'r68',
'9'=>'t67',
'a'=>'v66',
'b'=>'x65',
'c'=>'z64',
'd'=>'a63',
'e'=>'d62',
'f'=>'e61',
'g'=>'h60',
'h'=>'i59',
'i'=>'j58',
'j'=>'g57',
'k'=>'f56',
'l'=>'c55',
'm'=>'b54',
'n'=>'y53',
'o'=>'w52',
'p'=>'u51',
'q'=>'s50',
'r'=>'q49',
's'=>'o48',
't'=>'m47',
'u'=>'k46',
'v'=>'i45',
'w'=>'g44',
'x'=>'e43',
'y'=>'c42',
'z'=>'a41'
);

function my_custom_encode($string){
global $base_encryption_array ;
$string = (string)$string;
$length = strlen($string);
$hash = '';
    for ($i=0; $i<$length; $i++) {
        if(isset($string[$i])){
            $hash .= $base_encryption_array[$string[$i]];
        }
    }
return $hash;
}


function my_custom_decode($hash){
global $base_encryption_array ;
/* this makes keys as values and values as keys */
$base_encryption_array = array_flip($base_encryption_array);

$hash = (string)$hash;
$length = strlen($hash);
$string = '';

    for ($i=0; $i<$length; $i=$i+3) {
        if(isset($hash[$i]) && isset($hash[$i+1]) && isset($hash[$i+2]) && isset($base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]])){
            $string .= $base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]];
        }
    }
return $string;
}?>

пока все работает нормально. Шифрование отлично работает для нескольких уровней / итераций.

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

например, моя функция php для создания многократного итеративного хэша от идентификатора пользователя, я использую шифрование 2 раза, как это.

<?php
function userid_to_hash($userid){
    for($i = 1; $i <= 2; $i++) {
        $userid = my_custom_encode($userid);
    }

/* it returns hash*/
return $userid;
}?>

и моя функция декодирования нескольких итераций


скажем, userid = 41;

поэтому, когда я делаю это

<?php
$userid = 41;
echo userid_to_hash($userid)."<br>";
?>

я получаю вывод

g57p69f74a63p69l71

но когда я хочу расшифровать хеш и получить идентификатор пользователя, я получаю пустое пространство. как это

<?php
$hash = 'g57p69f74a63p69l71';
echo hash_to_userid($hash);
?>

я получаю пустую белую страницу. но если я установлю $hash для одноуровневого дешифрования, подобного этому, и использую пользовательскую функцию my_custom_decode, то он отлично работает для одной итерации.

<?php
$hash = 't67';
echo my_custom_decode($hash);
?>

дает правильный вывод.9

3 ответа

Решение

Вы должны рассмотреть возможность использования библиотеки шифрования.

Ответ на ваш вопрос заключается в том, что вы используете глобальную переменную.

Это действительно плохая практика:

global $base_encryption_array ; /* this makes keys as values and values as keys */ $base_encryption_array = array_flip($base_encryption_array);

Вы продолжаете переворачивать массив во втором цикле (когда вы пытаетесь декодировать), он больше не может найти ключ, потому что вы перевернули его дважды.

Ужасное быстрое исправление, просто переименуйте переменную массива в my_custom_decode.

"PHP Custom двустороннее шифрование и дешифрование", что я делаю не так?

Вы пытаетесь написать собственное шифрование.

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

Вам не хватает точки шифрования:

  • Алгоритмы должны быть общедоступными и хорошо изученными.
  • Ключи должны храниться в секрете.

Для этого: Рекомендуемые библиотеки криптографии PHP.

РЕДАКТИРОВАТЬ 2017-10-17:

это для создания личных URL, которые будут содержать личный хэш.

Извините, я как-то пропустил эту часть вашего вопроса в своем первоначальном ответе.

Шифрование даже не является подходящим инструментом для запутывания идентификаторов базы данных из запросов GET. Вместо этого вы хотите использовать случайно сгенерированный токен / отдельный поиск.

Другие вопросы по тегам