За последние 24 часа нас посетили 21624 программиста и 1017 роботов. Сейчас ищут 714 программистов ...

Шифровка паролей

Тема в разделе "PHP для новичков", создана пользователем VLK, 30 дек 2013.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Подскажите пожалуйста, как на данный момент лучше всего осуществлять шифровку паролей, в книге по которой я обучался (2010 г. издания) написано что крайне не рекомендовано держать пароли в БД в не зашифрованном виде и там рекомендуют использовать функцию sha1(), но тут http://php.ru/manual/function.sha1.html написано что не рекомендовано, т.к. на данный момент не сложно подобрать этот пароль.

    Я нашел такую функцию как crypt(), принимает 2 параметра, непосредственно пароль и текст на основе которой будет зашифрован пароль, возвращает пароль в зашифрованном виде.

    Как вы считаете нормально ли будет шифровать пароль при помощи crypt(), а потом еще полученный зашифрованный пароль шифровать еще раз при помощи sha1()? или это лишнее извращение?

    Еще несколько вопросов насчет crypt() и sha1():

    sha1() - возвращает зашифрованный пароль длинной 40 символов, а если изначально допустим пароль будет больше 40 символов, это нормально будет? "не сломается" данная функция?

    crypt() - возвращает каждый раз разные по длине пароли, а есть ли какой-нибудь придел по длине?

    crypt() - если у меня будет переносится проект с одного компьютера на другой, разные операционные системы, то данная функция будет выдавать одинаковые пароли? при использовании одинаковой "соли".

    и еще вопрос про пароли в целом, есть ли какие то рекомендованная длинна пароля? интересует ДО скольких символов?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. function enc($enc) {
    2.     return base64_encode(pack('H*',sha1(utf8_encode($enc))));
    3. }
    28 длина, не важно какие символы.
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Автор, почитай, что такое СОЛЬ. И поймешь, почему совершенно не важно, какой там у пользователя пароль. Если у тебя соль 40-значная и уникальная для каждого паса, хитро смешанная с паролем, то пароль может быть хоть два символа - он будет составлять лишь малую часть от каши, которую нельзя будет восстановить даже после однократного md5. У меня, например, генерится хитрая соль неопределенной длины, хитро комбинированная с паролем.

    Вот как это выглядит в БД:
    hash1
    6f81287bee475daa7c65a35dbeb926d5
    hash2
    dK@Qb:IMx4$rW7%Ghc(Gzb:i-GRL-xn59z:?[%43?

    Представь, что ты спер мою БД и нашел там вот это. Это реальная строка. С реальным паролем. Мой пароль от форума идентичен тому, что тут запрятан. Го, ломай )
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    А так в двух словах разъяснить нельзя?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    дополнительный текст, который смешивается с паролем
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Нет, пределов на длину пароля нет.

    Будет, если версия PHP везде 5.3 и выше.

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

    Добавлено спустя 2 минуты 45 секунд:
    10 знаков в разных регистрах с цифрами и спец-символами (типа %$&@#) на сегодня достаточно.
    Вот только советую внимательно изучить crypt по документации - в частности, какие там есть алгоритмы, и какие параметры там есть на усложнение расчета хеша.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    как это не будет, при добавлении в БД пароля я пишу так:

    Код (Text):
    1. $pass = 'qwerty';
    2. $pass = sha1 ( crypt ($pass, 'asd') );
    3. // далее добавляю в БД $pass
    4. //в итоге у меня в БД в поле pass будет: ac484effbfbfc70a66f88c23b0d03885a29d9f5f
    Код (Text):
    1. // потом пользователь вводит свой qwerty:
    2. $login =  'qwerty';
    3.  
    4. // из БД я получаю пароль и засовываю его в переменную $pass, т.е.:
    5. //  $pass = 'ac484effbfbfc70a66f88c23b0d03885a29d9f5f';
    6.  
    7. //потом я проверяю:
    8. if ( sha1 ( crypt ($login, 'asd') ) == $pass ) { echo 'OK'; }
    9. else { echo 'Not OK!'; }

    или я как обычно что то не понимаю?
     
  8. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Соль должна быть уникальна для каждого пароля, иначе ее смысл теряется. Смотрите примеры на странице описания crypt как правильно использовать.
     
  9. akela

    akela Новичок

    С нами с:
    14 дек 2013
    Сообщения:
    3
    Симпатии:
    0
    Шифрировать – c("memo1")->Text = Base64_EnCode( c("memo1")->Text );

    • Разшифрировать – c("memo1")->text = Base64_DeCode( c("memo1")->Text );

    • Копировать – c("memo1")->SelectAll();

    c("memo1")->CopyToClipBoard();

    c("memo1")->Set_SelLength(0);
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Ваши ответы меня пугают, т.к. я ни чего толком не понимаю.

    можно тогда последний наверное вопрос, если шифровать пароль при помощи sha1 при этом пароль будет 40 символов и более, то это нормально? нормально функция будет работать?
     
  11. semnt

    semnt Новичок

    С нами с:
    25 дек 2013
    Сообщения:
    93
    Симпатии:
    0
    Читайте описание функции:
    http://php.ru/manual/function.sha1.html
    Никакого ограничения для длину аргумента нету. Хоть мегабайт.
     
  12. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    akela, а зачем base64 с хэшированием смешивать? )
    у них как-бы разное предназначение
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Чтобы не пришли данные вида: �t�6�72�$@57���οJ�
    или
    �֠���R6iT?�e̛
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    без второго параметра в true они и не придут в таком виде
     
  15. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Тут так не сработает.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Чего это?
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    pack не выполнится
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а начерта он тут нужен?
     
  19. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Такой еще вопрос возник, а вот что бы узнать пароль зашифрованный sha1(), это выполняется методом подбора? или по другому?

    допустим если я буду шифровать пароль таким образом (ну или что то типа такого):
    Код (Text):
    1. $psw = sha1 ( sha1( sha1($psw) ) );
    поможет это или нет?
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    поможет. особенно если сто тысяч раз прогнать.
     
  21. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Для хранения паролей следует использовать crypt. Или http://ru2.php.net/manual/en/function.password-hash.php (для версии 5.5+, для младших версий есть PHP реализация - там же ссылка есть в "смотрите также").
    Ничего больше использовать нельзя если вы ничего не понимаете в криптографии.
     
  22. Yadfewm

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

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Код (Text):
    1.                     $hash1 = md5($_POST['reg_password']);
    2.                     $salt = uniqid(mt_rand(), true);
    3.                     $hash2 = md5($hash1.$salt);
    В базу данных для каждого пользователя пишу $salt и $hash2
     
  23. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    какой смысл? как было сказано выше "..спер мою БД..", в таком случае у злоумышленника будут все данные, вроде как пустой лишний шаг. или я как обычно чего то не понимаю?
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    спер бд не значит спер все вооообще :) Шаг не лишний, а правильный. Я, в примере спертого пароля, выложил то же самое - соль и финальный хэш. Ну дал я их, а что толку? Не зная правил засола, ничего не вытащить из этой каши.
     
  25. Yadfewm

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

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    помоему в моем коде есть смысл 100%тный, даже если сопрут мою базу, то пароли они не получат, а получат то только долгим долгим перебором (перебором все ломается)

    допустим у нас имеется обратная таблица md5? ну что-то вроде:
    k5bkh4b36vyc456v36hj7n5l6 -> password
    kj5hb6g45v6i3u6vi34u5hb64 -> mypassword
    sd54kj6hb63v6u35rc6t5c6t5 -> mybirthday19800101

    такие таблицы небольшие и содержат часто используемые пароли, в этом случае при спёртой БД пароли вскрываются у большинства пользователей использующих адекватные пароли типа mysecretpassword, но такие таблицы врядли содержат обратные пароли к oib32vu2vu24oniwneiowit3o45o32ij4n534 - а такие пароли бывают, у Артемия Лебедева например.

    как раз, в моём случае при спёртом бд они должны получить следующее
    oihfeifnfww3iom6o67bu5o6 -> aks4h5biu3v36i6v75iu67vu5b5ub556k45j6bh7iu4v6i4u64ibu4
    и только потом, зная мой алгоритм (я надеюсь они у вас только БД поперли а не весь сайт со скриптами) они должны вычесть из aks4h5biu3v36i6v75iu67vu5b5ub556k45j6bh7iu4v6i4u64ibu4 соль, получить aks4h5biu3v36i6v75iu67vu и уже от этого ещё раз прогонять обратную таблицу.

    Этих "засаливаний" можно сделать несколько 5 - 6 - 32 - 64, и тогда чтобы восстановить пароль потребуются годы.

    те статьи которые вы читали говорят о том, что нынешние суперкомпьютеры способны перебрать практически полную обратную таблицу md5, согласен) можно заморочится несимметричным шифрованием =) и вообще увлечься криптографией и больше не писать сайты вообще )

    Правило криптографии: грубой силой (перебором) можно сломать любой пароль (это аксиома), а настоящая цель шифрования - увеличить время которое необходимо для взлома.

    Добавлено спустя 5 минут 53 секунды:
    Я уже точно не помню почему соль должна быть динамической, почему перед засаливанием сам пароль необходимо мдпятить, где то прочитал... А про соль кратко почитать тут (ВИКИ) http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0% ... 0%B8%D1%8F)