Каков наилучший способ зашифровать очень короткую строку в PHP? - PullRequest
12 голосов
/ 19 сентября 2008

Я хотел бы зашифровать строки, которые могут быть длиной всего три или четыре символа, но могут содержать до двадцати символов. Функция хеширования ( md5 , sha1 , crypt и т. Д.) Не подходит, так как я хотел бы также иметь возможность расшифровывать информацию. Расширение mcrypt обладает огромным набором возможностей.

У кого-нибудь есть идеи относительно лучшего способа безопасного шифрования коротких строк и почему ? У кого-нибудь есть ссылки на какие-либо материалы, знакомящие обычного программиста с практическими сценариями шифрования?

Ответы [ 8 ]

6 голосов
/ 19 сентября 2008

mcrypt по умолчанию связан с большинством сборок PHP. Он содержит все примитивы, которые вам могут понадобиться. Не зная больше о том, что вы шифруете, какова ваша модель угроз и т. Д., Трудно дать конкретные рекомендации о том, какой алгоритм, режим работы и т. Д. Использовать.

Одно могу сказать наверняка: с короткими текстовыми строками, как никогда важно, вы ДОЛЖНЫ использовать уникальный случайный вектор инициализации. В противном случае для кого-то тривиально организовать различные атаки на зашифрованные данные.

6 голосов
/ 19 сентября 2008

Мне нравится использовать GnuPG для всего, что необходимо зашифровать на сервере, а затем, возможно, расшифровать на сервере или на другом сервере (что обычно является моим случаем). Это обеспечивает дополнительный уровень безопасности, поскольку в моем сценарии у сервера шифрования нет ключа для расшифровки данных. Это также позволяет легче расшифровывать вручную. Есть несколько хороших упаковщиков для разных языков (еще одно преимущество), один для PHP это GnuPGP PHP Class .

4 голосов
/ 27 сентября 2008

Я настоятельно рекомендую Chris Kite . Не зная больше о том, что вы делаете, почему и ожидаемых угроз для защиты от AES-128, вероятно, достаточно. Возможность использовать симметричное шифрование отлично подходит для автономного приложения, которое будет одновременно расшифровывать и шифровать данные. Как сказали Chris Kite и Arachnid , из-за небольшого размера ваших данных рекомендуется дополнять данные и использовать случайный вектор инициализации.

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

Теперь, если вы собираетесь шифровать на одном сервере и расшифровывать на другом, я бы пошел с предложениями pdavis . Используя асимметричный метод, вы можете отделить ключи шифрования от ключей дешифрования. Таким образом, если сервер, который шифрует данные, скомпрометирован, злоумышленник все равно не сможет расшифровать данные.

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

3 голосов
/ 19 сентября 2008

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

2 голосов
/ 24 сентября 2008

Я согласен с Крисом Кайтом - просто используйте AES 128, этого вполне достаточно.

Я не знаю точно вашу среду, но я полагаю, вы как-то передаете данные через Интернет.

Не используйте ECB, это всегда приведет к одному и тому же результату для одного и того же простого текста.

Режим CBC - это то, что нужно, и не забывайте случайный вектор инициализации. Этот вектор должен быть сообщен с зашифрованным текстом и может быть отправлен открытым текстом.

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

2 голосов
/ 19 сентября 2008

Если вы хотите зашифровать и расшифровать данные в приложении, вы, скорее всего, захотите использовать шифр с симметричным ключом. AES, который является алгоритмом симметричного блочного шифрования, сертифицированным NSA для защиты сверхсекретных данных, является вашим лучшим выбором. Доступна реализация на чистом PHP по адресу www.phpaes.com

Для вашего использования, похоже, достаточно AES128. Вы захотите использовать режим CBC со случайным вектором инициализации, иначе одни и те же данные всегда будут создавать один и тот же зашифрованный текст.

Выбор правильного алгоритма шифрования - это хороший первый шаг, но есть много факторов, которые затрудняют правильную систему, таких как управление ключами. Существуют хорошие ресурсы, такие как Прикладная криптография Брюса Шнайера и Техника безопасности Росса Андерсона (доступны бесплатно онлайн).

0 голосов
/ 21 сентября 2014

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

function encryptstring($string) {

$string_length=strlen($string);
$encrychars=""; 
/**
*For each character of the given string generate the code
*/
for ($position = 0;$position<$string_length;$position++){        
    $key = (($string_length+$position)+1);
    $key = (255+$key) % 255;
    $get_char_to_be_encrypted = SUBSTR($string, $position, 1);
    $ascii_char = ORD($get_char_to_be_encrypted);
    $xored_char = $ascii_char ^ $key;  //xor operation
    $encrypted_char = CHR($xored_char);
    $encrychars .= $encrypted_char;
} 
/**
*Return the encrypted/decrypted string
*/
return $encrychars;
}

На странице со ссылкой для добавления идентификатора необходимо шифровать

   /**
    *While passing the unique value to a link
    *Do the following steps
    */

    $id=57;//or if you are fetching it automatically just pass it here
     /**
     *For more security multiply some value
     *You can set the multiplication value in config file
     */
     $passstring=$id*346244;
     $encrypted_string=encryptstring($passstring);
     $param=urlencode($encrypted_string);
     /**
     *Derive the url for the link
     */
     echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ;

В целевом файле, который открывается после нажатия на ссылку

     /**
      *Retriving the value in the target file
      *Do the following steps
      */
      $fetchid=$_GET['aZ98#9A_KL'];
      $passstring=urldecode(stripslashes($fetchid));
      $decrypted_string= encryptstring($passstring);
      /**
       *Divide the decrypted value with the same value we used for the multiplication
       */
      $actual_id= $decrypted_string/346244;
0 голосов
/ 19 сентября 2008

Думаю, подойдет любой односторонний алгоритм шифрования, такой как Blowfish. Blowfish быстрый и открытый. Вы можете использовать Blowfish через функцию crypt (). AFAIK нет алгоритма шифрования, который особенно хорошо работает на небольших строках. Однако следует помнить, что такие небольшие струны будут очень просты. Возможно, вам следует зашифровать строку вместе со «секретным» солт-значением для дополнительной безопасности.

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