Вопрос по php, encryption – шифрование паролей php

1

Ладно, я знаю, что эта тема очень популярна впереполнение стек но они не подчеркивают ответы, которые я ищу.

Я использую шифрование md5, которое, как я сказал (это было некоторое время назад, когда я был новичком в php), было безопасно, но если вы посмотрите его на старом добром Google, он зашифровал и расшифровал.

Так что я начал искать другие места, ака здесь.

ive слышал обо всех методах шифрования, например, SHA-1, MD5, SHA-2, SHA-256, SHA-512 и т. д.

Многие говорят, что используют Bcrypt что я смотрю, это то, что против SHA-512.

и люди говорят, что использовать случайную соль и сохранять ее в своей базе данных, что глупо, потому что, скажем, хакер взломает вашу базу данных и получит соль всех ваших паролей, так что это маленькое окно для изменения всех солей, прежде чем хакер расшифрует все пароли и перейти в другие места и попробовать их, например, facebook, google и stackoverflow

Так что мой вопрос - это самый безопасный способ сделать это (шифрование (с помощью SHA-512) и использовать случайную соль, которая также будет храниться в базе данных), или использовать фиксированную соль, жестко привязанную к моему php-коду, которая имеет тот же уровень безопасности, что и в случайной соли базы данных.

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

ОН почти забыл, и безопаснее ли, если вы шифруете пароль несколько раз, или примерно столько же, сколько только одно шифрование?

Спасибо за помощь в написании переписки.

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

простите за эт

"и люди говорят, что используют случайную соль и сохраняют ее в своей базе данных, что глупо, потому что ..." deceze♦
Прочтите это для начала: Chargen.matasano.com / CHARGEN / 2007 / 9/7 / ... deceze♦
Хеширование (MD5) не является Шифрования. И не называйте что-нибудь «глупым», когда вы явно этого не понимаете. Что бы вы ни читали, либо это было плохо, либо вы не поняли. deceze♦
@ user1285198 скажи, скажи пользователю, что он глупый и ему нельзя позволять что-либо разрабатывать PeeHaa

Ваш Ответ

5   ответов
7

которое, как я сказал (это было некоторое время назад, когда я был новичком в php), было безопасно, но если вы посмотрите его на старом добром Google, он зашифровал и расшифровал.

Сначала немного придирки. Это хеширование, а не шифрование. Хеширование - это один из способов. Теперь, чтобы ответить на ваш вопрос: не используйтеmd5() хэшировать пароли. Это больше не безопасно. Он был сломан уже несколько лет. Мало того, что были обнаружены коллизии (множественные значения, которые приводят к одному и тому же хешу), но md5 действительно может быть обработан грубодействительн быстро с любым приличным графическим процессором.

Многие говорят, что использую Bcrypt, который я смотрю, это против SHA-512

Ты должен использовать bcrypt. На данный момент это лучший вариант для хеширования паролей.

а люди говорят, что используйте случайную соль и сохраните ее в своей базе данных, что глупо

Нет, это не глупо. Соляные пароли не позволяют злоумышленнику создать радужную таблицу для всех ваших паролей. Ircmaxell для вашего удобства создал пароль lib, который можно найти на GitHub.

Некоторые похожие статьи и сообщения о переполнении стека:

Существуют ли более современные методы хеширования паролей, чем bcrypt и scrypt?bcrypt FAQ Достаточно с радужными таблицами: что нужно знать о безопасных схемах паролей Как вы используете bcrypt для хэширования паролей в PHP? Представляем: PasswordLib Правильно соляные пароли, дело против Пепперапаргалка для хранения пароля @OWASP

Обновит

Когда выйдет PHP 5.5, появится простой способ корректного шифрования ваших паролей. Он будет использовать bcrypt по умолчанию и автоматически добавит соль в ваши пароли. Когда в будущем станет доступен лучший алгоритм (например, scrypt), он сможет его использовать. Для получения дополнительной информации см. RFC об этой новой функции. Он также будет иметь функцию, которая обнаруживает используемый алгоритм хэшированных паролей и автоматически может обновлять их, когда пользователи входят в более новый (/ более безопасный) алгоритм, если он доступен. Для примеров реализации проверьте это GitHub гист.

Если вы все еще используете более старую версию PHP и не можете ее обновить, чисто PHP-реализация C API, доступная с поддержкой PHP> = 5.3.7. Этот compat API использует ту же реализацию, что и C API.

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

@ user1285198 Нет, это не ошибка безопасности. Соль общедоступна, и это нормально. Единственное, что мешает засолке, это то, что злоумышленник не может создать радужную таблицу из всех паролей одновременно. Но злоумышленник должен создать радужную таблицу для каждой соли. PeeHaa
im не говорю, что солить глупо, я просто говорю, что сохранение значения соли в вашей базе данных является своего рода недостатком безопасности, так как кто-то может получить все значения соли и использовать их против вашей системы, чтобы найти пароли ryanc1256
@ user Соль в том, чтобы в вычислительном отношении значительно дороже (и отнимать много времени) взломать пароль. Да, это может занять еще больше времени, если у атакующего не было соли, но с надлежащим алгоритмом хеширования это спорный вопрос, так как это займет достаточно много времени. И с тех порвариложение @ должно иметь доступ к хешу, так как обычно вы мало что можете сделать, чтобы спрятать его от злоумышленника. deceze♦
@ LawrenceCherone нет, это не так. Если злоумышленник получит доступ через SQL-инъекцию, а пароли будут должным образом зашифрованы и засолены, хэши паролей / зашифрованный пароль будут бесполезны. PeeHaa
2
так какой путь будет безопаснее, хотя мой вопрос вроде ryanc1256
Самый безопасный способ - прочитать эту тему, прежде чем идти дальше. Это хорошее начало: / Stackoverflow.com вопросы / 4948322 / ... BluesRockAddict
0

а также строку в коде php. Теоретически им нужен код и БД, чтобы понять это.

Так что в вашем примере вы берете часть их имени пользователя и забрасываете его солью (и (хэш / шифрование), я прав? ryanc1256
yea. Я не знаю, если это хороший совет или нет. По сути, он имеет преимущество, заключающееся в том, что у всех есть другая соль, которая не хранится полностью или явно в базе данных. Andy Groff
0

так как она предотвращает предварительные вычисления всех возможных результатов. Несколько раундов также помогают немного замедлить процесс, но не сильно, если кто-то получит доступ к хэшам и получит в свое распоряжение несколько графических процессоров. Чтобы ответить на вопрос конкретно, если бы я был вами, и я мог бы использовать bcrypt, то я бы сделал. Если вы решили использовать хэш SHA-512, используйте соль и несколько раундов (десятки тысяч раундов).

Также, MD5 и SHA1 хэширование и т. Д. Является односторонним. Единственный способ получить исходный результат из хэша - это грубой силой или просто удачей угадать его.

0

Июнь 2015 Обновление:

Как говорилось в @PeeHa, PHP 5.5 включает в себя встроенный механизм и краткое руководство / объяснение реализации хешированного пароля с помощью PHP. Вы можете проверить это Хэшинг паролей.

Хэширование паролей возможно с помощью следующих методов:

string password_hash ( string $password , integer $algo [, array $options ] )

password_hash () создает новый хэш пароля, используя надежный односторонний алгоритм хеширования. password_hash () совместим с crypt (). Поэтому хэши паролей, созданные crypt (), могут использоваться с password_hash ().

boolean password_verify ( string $password , string $hash )

Проверяет, что данный хеш совпадает с заданным паролем.

Вы, вероятно, получите входные данные от пользователя, поэтому для предотвращения SQL-инъекций я бы рекомендовал использовать эти методы для очистки ввода:

Вы можете использоватьподготовленное заявлени, который позволяет безопасно вставлять пользовательский ввод в запрос SQL:

 $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
 $stmt->bindParam(':name', $name);
 $stmt->bindParam(':value', $value);

 $name = 'one';
 $value = 1;
 $stmt->execute();

Больше информации о подготовленном заявлении в@ Theos answer.

Другие альтернативы очищают строки ввода пользователя:

string stripslashes ( string $str )

Пример использования stripslashes () - это когда PHP-директива magic_quotes_gpc включена (она была включена по умолчанию до PHP 5.4), и вы не вставляете эти данные в место (например, базу данных), которое требует экранирования. Например, если вы просто выводите данные прямо из формы HTML.stripslashes API

string mysqli::escape_string ( string $escapestr )

Эта функция используется для создания допустимой строки SQL, которую можно использовать в операторе SQL. Данная строка кодируется в экранированную строку SQL с учетом текущего набора символов соединения.real_escape_string API

Edited. Вы абсолютно правы Technotronic
Если вы хотите отразить лучшую практику сегодняшнего дня, вам следует упомянуть параметризованные запросы вместо полоскового слэша и экранирования. martinstoeckli

Похожие вопросы