Лучший способ хранить имя пользователя и пароль без базы данных - PullRequest
8 голосов
/ 06 мая 2010

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

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

Если я создаю php-файл с

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

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

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

Спасибо

Ответы [ 9 ]

3 голосов
/ 06 мая 2010

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

Для этого вы можете использовать PHP md5 или sha1 хеш-функций.

3 голосов
/ 06 мая 2010

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

user:<sha1hash>
user:<sha1hash>
...
2 голосов
/ 06 мая 2010

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

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

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

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

1 голос
/ 06 мая 2010

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

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

$ hashedPassword = $ salt. хеш ($ salt. $ password);

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

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

bob:$2a$05$tlk4M8WSpVkO7ER6QGxcwuY91MrBCQn.TCDZ5eOM1iz2sCChtR62K

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

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

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

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

Мое лучшее предположение заключается в том, что вы имеете в виду инструмент, который искал хеш из предварительно вычисленной таблицы и вернул правильную строку ввода, вероятно, будет вашим паролем.
Эти таблицы называются радужными таблицами . Они могут быть побеждены А), используя случайную соль и В), используя алгоритм сильного хеширования (например, хэш BCrypt или семейство SHA2)

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

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

1 голос
/ 06 мая 2010

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

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

1 голос
/ 06 мая 2010
  • Вы можете использовать простой текстовый файл с функцией hash или crypt . Это надежно, но не очень гибко, если у вас много пользователей.

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

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

0 голосов
/ 19 октября 2012

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

$ password_hash = hash ("sha256", "iamawesome"); // 4aa4029d0d0265c566c934de4f5e0a36496c59c54b6df8a72d9c52bdf0c1a0e8

$ user_entered = hash ("sha256", $ _POST ['password']); return ($ user_entered == $ password_from_db);

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

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

0 голосов
/ 07 мая 2010

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

0 голосов
/ 06 мая 2010

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

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

...