За последние 24 часа нас посетили 21637 программистов и 1689 роботов. Сейчас ищут 1974 программиста ...

Хранение паролей в MySQL

Тема в разделе "MySQL", создана пользователем lecas, 3 фев 2008.

  1. lecas

    lecas Активный пользователь

    С нами с:
    22 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    При регистрации сохраняю данные пользователя следующим образом:
    [sql]INSERT INTO user VALUES(NULL, '$userid', password('$userpassword'),
    '$username', .....)[/sql]
    а при следующем запросе
    [sql]select * from user
    where userid='$userid'
    and passwd = password('$userpassword')[/sql]
    С данными пользователя, не находит в базе данных не одной строчки.
    Что тут неправильно с password('').
    Или просто при создании таблицы надо что-то дополнительное указывать.
     
  2. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    А что возвращает функция password()?
     
  3. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Goryn

    mysql> select password(1);
    +-------------------------------------------+
    | password(1) |
    +-------------------------------------------+
    | *E6CC90B878B948C35E92B003C792C46C58C4AF40 |
    +-------------------------------------------+
    1 row in set

    lecas

    после вставки данных mysql_error() что выдает?
     
  4. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Сорь. Тормознул :oops:
     
  5. lecas

    lecas Активный пользователь

    С нами с:
    22 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    попробовал
    mysql> select password(1);
    получил
    *E6CC90B878B948C35E92B003C792C46C58C4AF40
    нет там mysql_error(), или я что то не понял???
     
  6. lecas

    lecas Активный пользователь

    С нами с:
    22 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    а как посмотреть???
    $parol=mysql_result($result,$i, password('userpassword');
    так ему синтаксис не нравится как нужно???
     
  7. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    пароли не хранят в базе
    хранят "слепок" с пароля

    см.:
    функции sha1 и md5
    http://ru.wikipedia.org/wiki/Хеширование
     
  8. lecas

    lecas Активный пользователь

    С нами с:
    22 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    возвращает
    Код (Text):
    1. Call to undefined function password()
     
  9. lecas

    lecas Активный пользователь

    С нами с:
    22 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Ti, ты можешь написать как это должно выглядить в коде
     
  10. lecas

    lecas Активный пользователь

    С нами с:
    22 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Разобрался
    просто поле userpassword было создано как varchar(20),
    а при его шифровки значение получалось немного больше.
    поэтому он и не находил соответствующих строк данному запросу.
    =))))
     
  11. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. // все просто - вместо пароля взде используем слепок с него
    3. $passwordSha1 = sha1($userPassword);
    4. $sql = "INSERT INTO table(.., password) VALUES('$passwordSha1')";
    5.  
    6. // когда человек логиница - сверяем слепок
    7. $passwordSha1 = sha1($userPassword);
    8. $sql = "SELECT password = '$passwordSha1' AS is_valid_password FROM table WHERE ...";
    Таким образом система ничего не знает о пароле.

    Единственная проблема в том что алгоритмы md5 и sha1 (есть и другие алгоритмы хеширования, но эти наиболее популярны и идут в составе PHP) подбираются грубой силой - если человек узнает слепок он сможет подобрать пароль - весь прикол частично теряет свою красоту.
    Можно добавить проблем злоумышлинику - домешав в пароль перед снятием слепка уникальную строку. Таким образом, ему нужно будет знать не только слепок - еще алгоритм и уникальную строку. В таком случае, про исмпользование стандартных средств подбора пароля ему можно будет забыть.