Проблема с шифрованием паролей

akis

Новичок
Проблема с шифрованием паролей

Есть небольшая база данных MySQL, в которой хранятся имена пользователей и пароли.
Данные заносятся при помощи phpmyadmin.
Локально все работает, а вот на хостинге проверка паролей не проходит.

В локальной версии MySQL установлена опция OLD_PASSWORDS = ON.
На хостинге OLD_PASSWORDS = OFF и сменить, возможно, не получится.
На хостинге при занесении данных пробовал как функцию PASSWORD, так и OLD_PASSWORD, но результат тот же.

На хостинге MySQL Client API version 4.1.14
Локольный MySQL Client API version 3.23.49
Версия PHP и локальная и на хостинге 4.3.11
 

tf

крылья рулят
попробуй sha1 md5 в php если не хочеш мучатся
 

realman

Новичок
md5, sha1
храни в базе хеши паролей. при авторизации юзеров сравнивай хеш введенного пароля с хешем из базы.
 

tf

крылья рулят
PHP:
$pas=sha1('paaword');
insert into db set password='$pas';
slect from db where password='$pas';
так ясно?
 

akis

Новичок
Автор оригинала: tf
PHP:
$pas=sha1('paaword');
insert into db set password='$pas';
slect from db where password='$pas';
так ясно?
Попробовал вместо password() использовать md5() и sha1().
Тоже не работает, причем не только на хостинге, а даже локально.
Может в чем то другом проблема? Не может ли такого быть из-за разных кодировок например?
 

tf

крылья рулят
akis сорее проблема в твоем понимании
ps. PASSWORD - sql
md5 и sha1 имеллюось ввидду php
если ты так и понимаеш то лучше приведи свой запрос. а посмотрим что можно сделать
 

akis

Новичок
Автор оригинала: tf
akis сорее проблема в твоем понимании
ps. PASSWORD - sql
md5 и sha1 имеллюось ввидду php
если ты так и понимаеш то лучше приведи свой запрос. а посмотрим что можно сделать
Вот такой вот код проверки:

if(isset($_POST["check"])){

$login = $_POST["login"];
$pass = $_POST["pass"];

// check login & password
$result = @mysql_query("SELECT id FROM users WHERE login='".$login."' AND pass=password('".$pass."')") or die ("Invalid query");

if( mysql_num_rows($result) != 1 ) {

mysql_free_result($result);
$_SESSION['auth'] = 'false';

} else {

mysql_free_result($result);
$_SESSION['auth'] = 'true';
$_SESSION['name'] = $login;

};
};
 

tf

крылья рулят
akis яж тебе русским языком говорю md5 и sha1 имеллюось ввидду php
PHP:
$login=addslashes($login);
$pass=(sha1($pass));
"SELECT id FROM users WHERE login='$login' AND pass='$pass'";

до этого "insert into usert SET login='$login', pass='$pass'"
ps. надеюсь я со addslashes не перебрщил
 

akis

Новичок
Кажется, я понял в чем было дело:)

У меня в базе данных pass был varchar(16).
А новые алгоритмы криптования, видимо, давали хэш большей длины, который, ессессно, не совпадал при проверке с обрезанным хэшем в базе.

Для исправления ситуации использовал sha1 и изменил pass на varshar(40).
Локально это работает.

Надеюсь на хостинге тоже заработает, только он вот слег, так что проверить пока не удается:)
 

white phoenix

Новичок
А зачем через PHP генерировать? В MySQL есть встроенные функции для этого. Для md5 нужно поле varchar(32).
 

tf

крылья рулят
white phoenix да ктож знал что у него в размере проблемы были
 

Myst

Новичок
Но все же проблема остаетса в силе ? принцип хеширования в mysql работает
PHP:
extract($_POST); 
mysql_query("insert into auth value ('$name' , password('$password')") or die("Not inserted");
Добавили имя и пароль , пароль хешированый , дальше вроде бы тоже все легко создать запрос

PHP:
$query = "select count(*) from auth where
name = '$name' and
pass = password('$password')";
$result = mysql_query($query) or die("Cannot run query");

 
$count = mysql_result($result,0,0);
if ($count)
 {
    echo "I bet you are glad you can see this secret page.";
 }
else
  {
    echo "You are not authorized to view this resource.";
  }
Не работает всегда вылетает You are not authorized to view this resource

Пробовал разные варианты в шеле mysql и там не хочет выводить не count не сам пароль в шеле пробовал вот так зная пароль зараннее

PHP:
select * from auth where
pass = password('test123');
ответ empty

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

P.S. С md5 , sha1 все работает прекрасно , но сам факт что в mysql password тоже должен работать , если учить то учить основательно я думаю.
 

Dreammaker

***=Ф=***
Myst,
Опять же посмотри не слишком ли маленькая длина поля.
Если нет, то взгляни - первый запрос, который ты написал в своём посте точно соответствует, тому, который ты используешь у себя? В нём не всё корректно...

> mysql_query("insert into auth (name,pass) values ('$name' , password('$password')") or die("Not inserted");

Вот пример, который превосходно работает(по крайней мере на 3.23 :) ):

PHP:
$name='nmaaa';

$password='test123';

$sql="INSERT INTO  auth (name, pass) values ('".$name."' , password('".$password."'))";

mysql_query($sql) or die("bad query");

$sql="SELECT name FROM auth WHERE pass=password('".$password."')";

$res=mysql_query($sql) or die("bad query 2");

if (mysql_num_rows($res)>0) {
  while ($r=mysql_fetch_array($res)){
      echo "name=".$r['name']."<br>";
    }
}
 

Myst

Новичок
Насчет моего первого запроса , поскольку база создана уже ранее с таблицами и колумнами то думаю не имеет смысла добавлять их снова , я просто написал что я добовляю тоесть само value.

Насчет твоего запроса он у меня тоже не работает перепробовал уже все что мог , в шеле тоже пробовал напостой выдает empty set.

Есть один момент

PHP:
$sql="SELECT name FROM auth WHERE pass=password('".$password."')";
Незнаю может я не так немного понимаю , но почему ты ищеш пасс в столбце name ?

Самое главное добавить могу а вот вызвать немогу

Версия пхп - php-5.0.5-Win32 установлен как модуль.

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

Dreammaker

***=Ф=***
Myst,
э-э-э человече.... :)

Явно нужно синтаксис майскуэль подучить.

Я не ищу пасс в столбце name. А (следим за движениями рук:) ), точнее за запросом...

"Выбрать значение столбца name в строках, у которых pass равно значению переменной $password обработанной функцией password"

У тебя точно не выдаёт Not inserted?

Может у пятой версии синтаксис поменялся, но insert не создаёт столбцов, в нём мы указываем в какие столбцы вставлять данные... И что-то мне подсказывает, что у тебя должна быть ошибка...

в общем лучше забудь об or die("Not inserted")

и поставь вместо этого or die(mysql_error())


В первоначально, после твоего запроса посмотри (например, через PHPMyAdmin) вставилось ли что-то в базу вообще?
 

Myst

Новичок
И так спасибо Dreammaker все таки ты во одном ты был прав ето был varchar маленький , для функции password нужна длинна поля 41 , у меня была 40 :).
 
Сверху