
19.12.2007, 02:18
|
|
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
Провел на форуме: 12702287
Репутация:
4738
|
|
Вот сделал функцию для распознавания типа хэша (пока только 4, точнее 3, так как хэши MySQL5 и SHA-1 неотличимы).
PHP код:
function type_hash($string)
{
if (ereg('^([a-fA-F0-9]{16})$', $string)) return 1; // MySQL
if (ereg('^([a-fA-F0-9]{32})$', $string)) return 2; // MD5
if (ereg('^([a-fA-F0-9]{40})$', $string)) return 3; // MySQL5 или SHA-1
return 0; // неизвестен
}
1.Как сделать тоже самое, используя функцию preg_match?
2. Помогите с регулярками для определения типов хэшей:
DES (пример:HlXOX8MN5z4X6),
MD5 (Unix) $1$$uqbusDeGY2YWqg.T2S1100
MD5(APR) $apr1$$kRqAZHnuzcwDL84Mm7oc1.
MD5(Base64) Gh3JHJBzJcaScd3wyUS8cg ==
SHA-1 (Base64) NU4eI71bcnBGqeO0t9tXvY1u5oQ =
Последний раз редактировалось -=lebed=-; 19.12.2007 в 03:33..
|
|
|

19.12.2007, 02:59
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 331
Провел на форуме: 1724067
Репутация:
806
|
|
Сообщение от -=lebed=-
Вот сделал функцию для распознавания типа хэша (пока только 4, точнее 3, так как хэши MySQL5 и SHA-1 неотличимы).
PHP код:
function type_hash($string)
{
if (ereg('^([a-fA-F0-9]{16})$', $string)) return 1; // MySQL
if (ereg('^([a-fA-F0-9]{32})$', $string)) return 2; // MD5
if (ereg('^([a-fA-F0-9]{40})$', $string)) return 3; // MySQL или SHA-1
return 0; // неизвестен
}
1.Как сделать тоже самое, используя функцию preg_match?
2. Помогите с регулярками для определения типов хэшей:
DES (пример:HlXOX8MN5z4X6),
MD5 (Unix) $1$$uqbusDeGY2YWqg.T2S1100
MD5(APR) $apr1$$kRqAZHnuzcwDL84Mm7oc1.
MD5(Base64) Gh3JHJBzJcaScd3wyUS8cg ==
SHA-1 (Base64) NU4eI71bcnBGqeO0t9tXvY1u5oQ =
1.
PHP код:
if (preg_match("/^([a-fA-F0-9]{16})$/",$string)) echo 'MySQL ';
if (preg_match("/^([a-fA-F0-9]{32})$/",$string)) echo 'MD5 ';
if (preg_match("/^([a-fA-F0-9]{40})$/",$string)) echo 'MySQL или SHA-1';
2.
также как ты и делал, только те символы что не изменяются просто вводишь (только перед доларом надо постави "\" )
итак пример для
MD5(APR) $apr1$$kRqAZHnuzcwDL84Mm7oc1.
/^\$arp1\$\$[a-zA-Z0-9]{21}$/
ПС:для написания и отладки регулярных выражений можно использовать специальные прожки, например, VisualREGEXP и The Regex Coach
|
|
|

20.12.2007, 01:47
|
|
Members of Antichat - Level 5
Регистрация: 02.11.2006
Сообщений: 781
Провел на форуме: 5939734
Репутация:
1917
|
|
Сообщение от -=lebed=-
Вот сделал функцию для распознавания типа хэша (пока только 4, точнее 3, так как хэши MySQL5 и SHA-1 неотличимы).
PHP код:
function type_hash($string)
{
if (ereg('^([a-fA-F0-9]{16})$', $string)) return 1; // MySQL
if (ereg('^([a-fA-F0-9]{32})$', $string)) return 2; // MD5
if (ereg('^([a-fA-F0-9]{40})$', $string)) return 3; // MySQL5 или SHA-1
return 0; // неизвестен
}
1.Как сделать тоже самое, используя функцию preg_match?
2. Помогите с регулярками для определения типов хэшей:
DES (пример:HlXOX8MN5z4X6),
MD5 (Unix) $1$$uqbusDeGY2YWqg.T2S1100
MD5(APR) $apr1$$kRqAZHnuzcwDL84Mm7oc1.
MD5(Base64) Gh3JHJBzJcaScd3wyUS8cg ==
SHA-1 (Base64) NU4eI71bcnBGqeO0t9tXvY1u5oQ =
для MD5(Base64) и SHA-1 (Base64) даже придумывать ничего не надо поидее:
PHP код:
function type_hash($string)
{
if (ereg('^([a-fA-F0-9]{16})$', $string)) return 1; // MySQL
if (ereg('^([a-fA-F0-9]{32})$', $string)) return 2; // MD5
if (ereg('^([a-fA-F0-9]{40})$', $string)) return 3; // MySQL5 или SHA-1
if (ereg('^([a-fA-F0-9]{32})$', base64_decode($string))) return 4;// MD5(Base64)
if (ereg('^([a-fA-F0-9]{40})$', base64_decode($string))) return 5; //SHA-1 (Base64)
return 0; // неизвестен
}
__________________
Карфаген должен быть разрушен...
|
|
|

19.12.2007, 12:37
|
|
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
Провел на форуме: 12702287
Репутация:
4738
|
|
Вот способ как запросить из мускула MySQL хэш:
PHP код:
$query = "SELECT PASSWORD('".$pass."')";
$r = mysql_query($query);
$rq = mysql_fetch_array($r);
$hash = $rq[0]; //МуSQL хэш
Я так понял, что если Мускул <5 это будет хэш (0-9a-z {8})
а если MySQL5 то хэш будет (0-9a-z {40})
Теперь вопрос: Как независимо от версии Мускула получать хэши MySQL и MySQL5 от какого либо значения? Т.е. может есть готовые функции хэширования на PHP, независящие от мускула и не обращающеся к нему?
Ну типа как в встроенных функциях PHP md5(), sha1()
ЗЫ Чё? так никто и не знает как в Мускуле <5 вычислить хэш Mysql5 ?
Видел где-то что sha1(sha1(password)) это и есть MySQL(password) это так ? Щас проверю сам... неправда
Последний раз редактировалось -=lebed=-; 19.12.2007 в 17:15..
|
|
|

19.12.2007, 19:02
|
|
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме: 1469995
Репутация:
589
|
|
Сообщение от -=lebed=-
Вот способ как запросить из мускула MySQL хэш:
PHP код:
$query = "SELECT PASSWORD('".$pass."')";
$r = mysql_query($query);
$rq = mysql_fetch_array($r);
$hash = $rq[0]; //МуSQL хэш
Я так понял, что если Мускул <5 это будет хэш (0-9a-z {8})
а если MySQL5 то хэш будет (0-9a-z {40})
Теперь вопрос: Как независимо от версии Мускула получать хэши MySQL и MySQL5 от какого либо значения? Т.е. может есть готовые функции хэширования на PHP, независящие от мускула и не обращающеся к нему?
Ну типа как в встроенных функциях PHP md5(), sha1()
ЗЫ Чё? так никто и не знает как в Мускуле <5 вычислить хэш Mysql5 ?
Видел где-то что sha1(sha1(password)) это и есть MySQL(password) это так ? Щас проверю сам... неправда
Вместо PASSWORD двойной SHA1 использовался только в одном буилде мускула, а именно MySLQ 5.0.27
|
|
|

19.12.2007, 19:56
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме: 4608122
Репутация:
874
|
|
2 -=lebed=-
PHP код:
<?
echo sha1(sha1('mypass',1));
?>
Про это узнал вот тут http://www.wasm.ru/forum/viewtopic.php?pid=203131#p203131
Обрати внимание на слова
Второй раз нужно хешировать _бинарные_ данные.
Проверил на ПассвордПро
sha1('mypass') = e727d1464ae12436e899a726da5b2f11d8381b26
MySQL5('mypass') = 6c8989366eaf75bb670ad8ea7a7fc1176a95cef4
echo sha1(sha1('mypass',1)); >>> 6c8989366eaf75bb670ad8ea7a7fc1176a95cef4
Весь прикол в НЕОБЯЗАТЕЛЬНОМ параметре sha1. Нашел тут http://delaysayt.ru/sha1-vozvraschaet-sha1-hesh-stroki.html
Думаю это то что тебе нужно 
Последний раз редактировалось Red_Red1; 19.12.2007 в 20:26..
|
|
|

19.12.2007, 21:48
|
|
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
Провел на форуме: 12702287
Репутация:
4738
|
|
проверил, пашет! хэши скрипт от mypass выдаёт правильные.
Хэш MySQL:6f8c114b58f2ce9e
Хэш MD5:a029d0df84eb5549c641e04a9ef389e5
Хэш SHA1:e727d1464ae12436e899a726da5b2f11d8381b26
Хэш MySQL5:6c8989366eaf75bb670ad8ea7a7fc1176a95cef4
Но вот трабла при занесении в таблицу после преобразования этих хэшей, запрос вида:
PHP код:
INSERT INTO passwd_hash (`passwd`,`code1`,`code2`,`code3`,`code4`) VALUES ('mypass','oЊKXтОћ',' )РЯ„лUIЖAаJћу‰е','з'СFJб$6и™§&Ъ[/Ш8&','l‰‰6nЇu»g ШкzБj•Оф')
Выдаёт ошибку синтаксиса, так как после кодирования хэшей всплыли спецсимволы.
Какой тип данных поставить для полей, чтоб можно было хранить строку из любых символов (0-ff)
Напомню, мне нужно хранить (записывать) хэши в таблице(у) не в ASCII представлении, а в виде последовательности любых байтов, т.е в hex чтоб размер поля был в два раза меньше, т.е 8, 16, 20 байт для каждого типа хэша соответствено.
Использовал типы данных binary(8), binary(16), binary(20), binary(20) - непрокатывает запрос!
Тип bigint - 8 байт, подойдёт только для хранения хэша MySQL, а что делать с остальными (делить на столбцы не хотелось бы).
ЗЫ Даже тут видно, что запрос испортила всплывшая одинарная ковычка, в коде одного из хэшей. 
Последний раз редактировалось -=lebed=-; 19.12.2007 в 21:53..
|
|
|

19.12.2007, 21:59
|
|
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме: 1469995
Репутация:
589
|
|
varchar(8), varchar(16), varchar(20)
и прогоняй значения перед вставкой через mysql_escape_string(), она заэкранирует все спецсимволы, но мускул поймет все правильно
ЗЫ еще как вариант BLOB, но так как поле динамическое возникнут траблы с быстродействием
|
|
|

19.12.2007, 22:11
|
|
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
Провел на форуме: 12702287
Репутация:
4738
|
|
Сообщение от Helios
varchar(8), varchar(16), varchar(20)
и прогоняй значения перед вставкой через mysql_escape_string(), она заэкранирует все спецсимволы, но мускул поймет все правильно
ЗЫ еще как вариант BLOB, но так как поле динамическое возникнут траблы с быстродействием
BLOB не пойдёт, но ведь и тип varchar имеет динамический размер?! мне надо чтоб хэш занимал в таблице ровно столько байт, сколько на него реально нужно...
Up: вопрос решён, символы экранирования не записываются в столбцы таблицы, размер остаётся верный, исп. тип Binary.
Последний раз редактировалось -=lebed=-; 19.12.2007 в 23:03..
|
|
|

19.12.2007, 22:18
|
|
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме: 1469995
Репутация:
589
|
|
varchar имеет фиксированный размер (не зря он в скобках указан=)).
Днамические поля - это TEXT, BLOB и производные
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|