короче шифр php чем md5? - PullRequest
       27

короче шифр php чем md5?

19 голосов
/ 21 сентября 2010

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

Я хотел скрыть это значение с помощью md5, но, очевидно, с 12 символамиэто не сработает.Есть ли шифр с уже созданной функцией PHP, который даст 12 символов или меньше?

Безопасность и целостность шифра здесь не так важны.Мое последнее средство - просто написать функцию, которая перемещает каждую букву вверх или вниз по значению ascii на x.Таким образом, цель состоит не в том, чтобы скрыть это от эксперта по криптографии, а просто в том, чтобы не публиковать его в виде простого текста, чтобы не технический специалист, смотрящий на него, не знал, что это такое.

Спасибо за любой совет.

Ответы [ 8 ]

16 голосов
/ 19 февраля 2015

возможно, это поможет вам сгенерировать строку из 12 символов, которую вы можете передать в URL, не увеличивая риск коллизий

substr(base_convert(md5($string), 16,32), 0, 12);
16 голосов
/ 22 сентября 2010

Это дополнение к этому ответу .

Ответ предлагает взять первые двенадцать символов из 32-символьного представления md5. Таким образом, 20 символов информации будут потеряны - это приведет к способу большему количеству возможных коллизий.

Вы можете уменьшить потерю информации, взяв первые двенадцать символов 16-символьного представления (необработанная форма):

substr(md5($string, true), 0, 12);

Это будет поддерживать 75% данных, в то время как использование формы 32 символа поддерживает только 37,5% данных.

9 голосов
/ 21 сентября 2010

Попробуйте crc32 (), может быть?

8 голосов
/ 21 сентября 2010

Если вам просто нужен хеш, вы все равно можете использовать первые 12 символов из хеша md5.

substr(md5($yourString), 0, 12);
4 голосов
/ 08 октября 2013

Все ответы предполагают потерю некоторых данных (более высокая вероятность коллизий), но похоже, что использование базового преобразования является лучшим подходом: например, как описано здесь http://proger.i -forge.net / Short_MD5 / OMF

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

3 голосов
/ 24 октября 2013

Я должен подтвердить это предложение, так как должен предположить, что вы контролируете сценарий, на который отправляется ваше зашифрованное значение ....

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

Если это так, не могли бы вы просто создать более одного поля формы и распределить строку md5 по нескольким скрытым полям?

Вы можете просто разбить строку md5 на куски по 8 и представить каждый кусок в скрытом поле формы, а затем соединить их вместе на другом конце.

Просто мысль ...

0 голосов
/ 30 мая 2019

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

Я реализовал это здесь - например, хеш ee45187ab28b4814cf03b2b4224eb974 становится 7fBKxltZiQd7TFsUkOp26w - он идет от 32 до 22 символов. И это может стать еще меньше, если вы используете больший алфавит. Если вы используете Unicode, вы можете даже закодировать хэш с Emoji ...

0 голосов
/ 10 февраля 2019

Это, вероятно, не будет полезным для OP, так как они искали двустороннюю функцию, но может помочь кому-то, ищущему более короткий хеш, чем md5.Вот что я придумал для своих нужд (спасибо https://rolandeckert.com/notes/md5 за выделение функции base64_encode).Закодируйте хэш md5 как базу (64) и удалите все нежелательные символы базы (64).Я удаляю гласные + и / или уменьшаю эффективную базу с 64 до 52.

Обратите внимание, что если вы урежете закодированный в основе (b) хэш после символов c, это позволит использовать b ^ c уникальных хэшей.Достаточно ли это надежно, чтобы избежать столкновений?Это зависит от того, сколько элементов (k) вы хэшируете.Вероятность столкновения примерно равна (k * k) / (b ^ c) / 2, поэтому, если вы использовали функцию ниже для хеширования k = 1 миллиона элементов с базовым кодированием b = 52, усеченным после c = 12 символов, вероятность столкновения<1 на 750 миллионов.Сравните с усечением хеш-кода (b = 16) после c = 12 символов.Вероятность столкновения составляет примерно 1 на 500!Просто скажите нет усеченным шестнадцатеричным хэшам.:) </p>

Я выйду на конечность и скажу, что функция ниже (длиной 12) достаточно безопасна для 10 миллионов элементов (<1 из 7,5 миллионов вероятности столкновения), но если вы хотите бытьдополнительное безопасное кодирование base (64) (закомментируйте массив $ remove) и / или усечение меньшего количества символов. </p>

// convert md5 to base64, remove undesirable characters and truncate to $length
function tinymd5($str, $length) { // $length 20-22 not advised unless $remove = '';
    // remove vowels to prevent undesirable words and + / which may be problematic
    $remove = array('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U', '+', '/');
    $salt = $str;
    do { // re-salt and loop if rebase removes too many characters
        $salt = $base64 = base64_encode(md5($salt, TRUE));
        $rebase = substr(str_replace($remove, '', $base64), 0, $length);
    } while ($length < 20 && substr($rebase, -1) == '=');
    return str_pad($rebase, min($length, 22), '='); // 22 is max possible length
}

$str = 'Lorem ipsum dolor sit amet 557726776';
echo '<br />' . md5($str);         // 565a0bf7e0ba474fdaaec57b82e6504a
$x = md5($str, TRUE);
echo '<br />' . base64_encode($x); // VloL9+C6R0/arsV7guZQSg==
echo '<br />' . tinymd5($str, 12); // VlL9C6R0rsV7
echo '<br />' . tinymd5($str, 17); // VlL9C6R0rsV7gZQSg
$x = md5(base64_encode($x), TRUE); // re-salt triggered < 20
echo '<br />' . base64_encode($x); // fmkPW/OQLqp7PTex0nK3NQ==
echo '<br />' . tinymd5($str, 18); // fmkPWQLqp7PTx0nK3N
echo '<br />' . tinymd5($str, 19); // fmkPWQLqp7PTx0nK3NQ
echo '<br />' . tinymd5($str, 20); // fmkPWQLqp7PTx0nK3NQ=
echo '<br />' . tinymd5($str, 22); // fmkPWQLqp7PTx0nK3NQ===
...