Подтвердить что ты не робот

Каков наилучший способ шифрования очень короткой строки в PHP?

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

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;