2015-03-05 1 views
-4

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

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

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

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

<?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; 
}?> 

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

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

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

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

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

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


позволяет говорить Идентификатор_пользователь = 41;

так, когда я это сделать

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

я получить выходной

g57p69f74a63p69l71

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

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

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

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

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

+0

Вы находитесь в цикле my_custom_decode, похоже, что вы рискуете индексировать за пределы. Если вы получаете пустую белую страницу, опубликуйте исключение, заброшенное в журналы. Я предполагаю, что это «Вне исключения границ». Если длина строки не является модулем 3 == 0, то вы нажмете ее во время одного из ваших вызовов $ hash [$ i + n]. – eggmatters

+1

Я не думаю, что вы понимаете, насколько ЛЕГКО было бы для кого-то расшифровать это «шифрование». Это совершенно небезопасно. Вы просто выполняете перевод персонажей. Вероятно, вы можете переписать всю свою функцию с помощью [strtr] (http://www.php.net/strtr), которая делает именно то, что делает ваш цикл/concat. –

+0

* «Я получаю пустую белую страницу» * - Добавить отчет об ошибках в верхней части файла (ов) сразу после открытия PHP-тега например '

ответ

1

Необходимо использовать библиотеку шифрования.

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

Это действительно плохая практика, чтобы сделать это:

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

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

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

+0

спасибо, его действительно исправил код., – AMB

20

"PHP Пользовательские два способа шифрования и дешифрования", , что я делаю неправильно?

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

+0

[«Закон Шнейера»] (https://www.schneier.com/blog/archives/2011/04/schneiers_law.html): Любой, от самого невежественного любителя до лучшего криптографа, может создать алгоритм, который он сам не может сломаться. – zaph

8

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

Вы пропустили точку шифрования:

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

С этой целью: Recommended PHP cryptography libraries.

EDIT 2017-10-17:

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

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

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

+0

Многие из этих библиотек слишком сложны и слишком тяжелы для некоторых задач. Я хочу обработать страницу из 100 записей, чтобы обфускать ссылки для скачивания. Очевидно, что base64 недостаточно (даже с солью, потому что вы все еще можете видеть идентификатор в ясном тексте при декодировании), Blowfish - это перебор, а хеширование не работает, потому что мне нужно двустороннее шифрование. Итак, каков был бы самый быстрый способ создать простое и удобное для процессора решение для обфускации? Есть ли встроенный простой двухсторонний шифрование в PHP? Если нет, то пользовательский словарь символов выглядит нормально, если все сделано правильно. – JustAMartin

+0

См. [Руководство по шифрованию параметров URL] (https://paragonie.com/blog/2015/09/comprehensive-guide-url-parameter-encryption-in-php), которое включает в себя обфускацию идентификатора базы данных. –

+0

Кроме того: «Очевидно, что base64 недостаточно (даже с солью, потому что вы все еще можете видеть идентификатор в открытом тексте при декодировании)» - Пожалуйста, прочитайте: [Вы не создали бы пароль64] (https: // paragonie .com/блог/2015/08/вы-Wouldnt-base64-а-пароль-криптография декодируется). Base64 даже не шифрует, это кодирование. –

Смежные вопросы