Лучший способ хранить имя пользователя и пароль без базы данных

Я хочу создать простую «библиотеку» входа для одного пользователя на PHP, но столкнулся со следующей дилеммой: как мне хранить имя пользователя и пароль, если я не использую базу данных?

Простой текстовый файл может быть легко прочитан, а затем пароль может быть легко расшифрован, так что это не вариант.

Если я создам файл php только с

<?php
    $Username= "username";
    $Password= "password";
?>

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

Так какое, по вашему мнению, лучшее решение этой проблемы (и почему)?

Спасибо


person Mokuchan    schedule 06.05.2010    source источник


Ответы (9)


Простой текстовый файл возможен как вариант, и здесь это самое простое решение. Просто хэшируйте пароль (с солью). Это не может быть надежно расшифровано.

Вы можете использовать md5 PHP или sha1 для этого.

person Daniel DiPaolo    schedule 06.05.2010
comment
Есть некоторые инструменты, которые пытаются расшифровать md5 и sha1, и, по крайней мере, в некоторых случаях они работают (я пробовал их однажды). Я не думаю, что тогда соль будет полезна, вам просто нужно сделать несколько попыток. - person Mokuchan; 06.05.2010
comment
Если вы хотите использовать надежное шифрование/хэш, то это нормально, но простой файл с хэшированным паролем, безусловно, является самым простым решением. - person Daniel DiPaolo; 06.05.2010
comment
процитирую SLaks: используйте SHA2 (или bcrypt), пожалуйста! - person Jacco; 07.05.2010
comment
Все можно взломать методом грубой силы. У MD5 и SHA1 нет ключевой слабости, которой злоупотребляют эти инструменты (хотя у них есть есть ключевые слабости!) Просто это быстрые алгоритмы, так что нет ничего сложного в том, чтобы попробовать миллионы возможные хэши, чтобы найти правильный. Более медленные алгоритмы на самом деле сильнее в этом смысле. - person Matchu; 07.05.2010

Вы можете сохранить его в файле и использовать хэш SHA1/SHA2, чтобы его нельзя было расшифровать.

user:<sha1hash>
user:<sha1hash>
...
person Mitch Dempsey    schedule 06.05.2010
comment
SHA2 (или bcrypt), пожалуйста! - person SLaks; 06.05.2010

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

Проверьте, есть ли на вашем веб-хостинге какой-либо каталог, который не является общедоступным, например, родительский каталог, в котором находится фактический веб-контент. PHP обычно может читать и писать там, но он не будет доступен через Интернет.

Права доступа к файлам и/или файлы .htaccess (Apache) могут вам помочь если нет такого каталога, к которому у вас есть доступ.

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

person Thorarin    schedule 06.05.2010
comment
Я думал о правах доступа к файлам, но не знал, как их настроить, чтобы они работали: считается ли php пользовательскими, а внешние запросы другими? - person Mokuchan; 06.05.2010
comment
@Mokuchan: зависит от конфигурации сервера. Легче всего это узнать, проверив вывод phpinfo() для пользователя/группы. - person Thorarin; 06.05.2010

  • Вы можете использовать простой текстовый файл с хэшем или crypt. Это надежно, но не очень гибко, если у вас много пользователей.

  • Вы также можете использовать SQLite, которая является базой данных, но не сервером и хранится в простом файле. Это хороший компромисс, если вы не можете установить SQL-сервер, но хотите хранить много пользователей и иметь больше гибкости.

  • В зависимости от того, что вы хотите сделать, файл .htaccess может быть хорошее решение. Это уже безопасно, но, как решение для простого текста, оно не является гибким. Но он встроен почти во все конфигурации Apache.

person Boris Guéry    schedule 06.05.2010

Какова цель иметь имя пользователя, если есть только один пользователь?

С таким же успехом можно просто управлять разрешениями с помощью .htaccess...

person BlueRaja - Danny Pflughoeft    schedule 06.05.2010
comment
Это для предоставления доступа к функциям администратора, поэтому, даже если есть только один администратор, вам все равно нужен хотя бы пароль. Возможно, вам не нужно имя пользователя, но проблема не изменится. - person Mokuchan; 06.05.2010
comment
@Mokuchan: Проблемы не будет, если только ваш компьютер имеет доступ к странице... - person BlueRaja - Danny Pflughoeft; 06.05.2010
comment
@Mokuchan: вы используете .htaccess, чтобы только ваш компьютер мог получить доступ к странице администратора. См. здесь, здесь и, самое главное, здесь. - person BlueRaja - Danny Pflughoeft; 07.05.2010
comment
Я бы просто создал панель администратора как локальный веб-сайт, существующий на вашем собственном компьютере, и подключил бы его напрямую к базе данных. То есть, если вам не нужно делиться некоторыми библиотеками. Но в любом случае вы должны разрабатывать свой веб-сайт локально, поэтому включите их из своей локальной копии :) - person Matchu; 07.05.2010

(Это началось как комментарий Даниэлю ДиПаоло в ответ Мокучану.)

Если вы хотите сохранить пароль (независимо от места), вы используете следующую схему:

$hashedPassword = $соль. хеш ($ соль . $ пароль);

Место хранения хешированного пароля должно быть безопасным. Будь то в базе данных или в файле с соответствующими разрешениями.

Если это файл, ваша «запись» для пользователя bob с паролем secret будет выглядеть примерно так (с использованием BCrypt Hash):

bob:$2a$05$tlk4M8WSpVkO7ER6QGxcwuY91MrBCQn.TCDZ5eOM1iz2sCChtR62K

Никто не может «расшифровать» пароль. В этом весь смысл использования алгоритма хеширования: он необратим.

Вы утверждаете, что:

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

Поскольку алгоритмы хеширования необратимы, это невозможно. (Нет опции «расшифровать»)

Насколько я понимаю, вы имеете в виду инструмент, который просматривал хэш из предварительно вычисленной таблицы и возвращал допустимую входную строку, которая, вероятно, была вашим паролем.
Эти таблицы называются радужные таблицы< /а>. Их можно победить с помощью A) использования случайной соли и B) использования сильного алгоритма хеширования (например, хэш BCrypt или хэш семейства SHA2).

Что касается неправильных алгоритмов хеширования: MD5 и SHA1 считаются криптографически взломанными. Другими словами: вы не должны их больше использовать.

Для обсуждения этого см.: https://stackoverflow.com/questions/2768248/is-md5-really-that-bad

person Jacco    schedule 06.05.2010

То же самое со всеми, кто говорит, что вы можете зашифровать пароль.

Кроме того, не помещайте файл в дерево документов. Поместите файл в другое место. Ваша PHP-программа по-прежнему должна быть в состоянии прочитать его, указав абсолютный путь или относительный путь, который идет «..», сколько бы уровней ни работала иерархия, а затем туда, где находится файл. (В Java-приложениях есть каталог WEB-INF, который удобен для хранения такого рода материалов. Я не думаю, что в PHP есть что-то подобное — я давно не занимался PHP-программированием — но вы можете всегда просто помещайте файл полностью за пределы иерархии каталогов вашего приложения.)

person Jay    schedule 06.05.2010

Не изобретайте велосипед, используйте этот http://pear.php.net/manual/en/package.fileformats.file-passwd.file-passwd-unix.php

person Cristian Rodriguez    schedule 06.05.2010
comment
спасибо, но я думаю, что изобретать велосипед весьма поучительно: можно придумать интересные задачи, подобные этой, и на самом деле многому научиться. - person Mokuchan; 07.05.2010

Лучший способ сделать это

$password_hash = хеш ("sha256", "iamawesome"); // 4aa4029d0d0265c566c934de4f5e0a36496c59c54b6df8a72d9c52bdf0c1a0e8

$user_entered = hash("sha256", $_POST['пароль']); вернуть ($user_entered == $password_from_db);

hashin защитит ваш пароль..

подробная статья: http://wblinks.com/notes/storing-passwords-the-wrong-better-and-even-better-way

person Community    schedule 19.10.2012
comment
Прочтите еще раз. Лучший способ из статьи — использовать хорошо зарекомендовавшую себя библиотеку, которая была опробована и протестирована в полевых условиях и написана настоящими экспертами по безопасности. Существует множество вариантов, наиболее популярными из которых являются bcrypt и scrypt. - person Rich Adams; 31.10.2012