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. Вместо этого вы хотите использовать случайно сгенерированный токен / отдельный поиск.