2010-09-21 3 views
16

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

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

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

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

+2

Я искушен рекомендовать бросать в 'str_rot13()' позвонить куда-нибудь. В более серьезной ситуации, если вам нужно получить расшифрованную версию, вы не можете использовать 'md5()' так или иначе, поскольку это функция хеширования, что делает ее практически по существу односторонней. – BoltClock

+0

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

+0

Какой из них вы предложите, Джоэл? – tiredofcoding

ответ

14

Это дополнение к this answer.

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

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

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

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

+2

Это приводит к 12 * байтам *, которые не обязательно являются 12 * символами *, и также рискованно использовать это с не двоичными безопасными функциями, которые, к сожалению, все еще довольно распространены, поскольку они будут усекаться при первом символе '\ 0'. – CodesInChaos

+1

«md5 ($ string, true)' не возвращает также невидимые символы? Я думаю, что это вызовет проблемы в HTML - хэш может получить urlencoded браузером и изменить длину ... – Philipp

8

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

substr(md5($yourString), 0, 12); 
+0

Я просто печатал то же самое! –

+0

Я должен уточнить, что нам еще нужно его расшифровать. Может быть случай, когда первые 12 символов одного md5 являются такими же, как и другие. – tiredofcoding

+2

@tiredofcoding: MD5, как и любой другой хэш, является односторонней функцией: вы * не можете * декодировать его. То, что вы хотите, это шифр, а не хэш. – casablanca

7

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

3

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

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

3

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

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

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

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

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

15

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

substr(base_convert(md5($string), 16,32), 0, 12); 
+1

Это должен быть принятый ответ. Это полный MD5-хэш в более компактном представлении. – Deebster

+1

Это не сохраняет полный хэш MD5 ... Согласно документам PHP, «Предупреждение: base_convert() может потерять точность на больших количествах из-за свойств, связанных с используемым внутренним« двойным »или« плавающим »типом». В 32-битных системах, по крайней мере, преобразование 32-разрядного шестнадцатеричного значения в base-32 приводит к тому, что последние 16 цифр будут установлены на 0. Попробуйте: print base_convert (md5 ('foo'), 16, 32); приводит к 5cnkcdmj62v000000000000000. – mikeker

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