Всем привет.
Нужен ваш совет и мнение по вопросам так называемой "безопасной авторизации".
Недавно получил заказ от клиента на доработку и правку проекта который так или иначе связан с большими суммами.(проект взаимодействует с биткоинами ~27)
Ситуация такова что клиент попросил придумать и создать метод авторизации который:
1 Прост в использовании(не доставляет пользователю хлопот)
2 Устойчив к всяким бруттам,переборам, угонам кук и сессий.
3 Анонимен( без ввода каких либо данных и использовании всяких там OpenID и прочей лабуды которая так или иначе может скомпрометировать)
4 Запрещает(непозволяет) использование одного аккаунта одновремменно с двух девайсов.(если зашли к примеру с компа, а потом с тела то комп уже не авторизован, и наоборот, то же самое и с браузеров).
Согласитесь, задача кажется легкой НО в то же время если соединить все требования то есть над чем задуматься.
Поломав пару часиков голову возникла вроде неплохая идея, которую собственно и изложу в посте ниже, а вы уже выскажетесь насчет идеи.
Итак, сама идея возникла фактически из воздуха и никак не проверялась на наличии такого же метода где бы там не было, поэтому просьба не смеятся и не ругаться.
Идея в следующем, буду описывать поэтапно с момента регистрации пользователя.
Этап первый, регистрация.
Пользователю дается парочка полей(на выбор заказчика, они по сути не играют роли), например поле ввода даты рождения ну и поле для псевдонима(служит только для отображения, в том же форуме например),чекбокс для соглашения с правилами(куда без них), ну и каптча.
После того как пользователь заполнил поля и нажал кнопку далее(происходит проверка данных и фильтрация само собой) и вот тут начинается самое главное и интересное))
Этап второй(генерация ключа)
Пользователю предлагается скачать ключик для системы с помощью которого он сможет в дальнейшем авторизовываться.
В качестве "ключика" было решено генерировать картинку(изображение в формате jpg.
Спросите почему именно картинку, ответ прост, картинки реже всего сливаются вирусом с компа жертвы(дополнительная гарантия безопасности).
К примеру генерировать картинку с любым именем, начиная от 2 символов и до ~))
Как известно у любого файла есть уникальные SHA1, MD5, CRC32 хеши.
Так вот, при генерации файла, получить эти самые хеши(или один из них) и записать в базу при регистрации пользователя(своего рода пароль), так же в момент создания пользователя в базе генерируется uniqid(уникальный индентификатор пользователя, ну например как в джоне дается id)) и так же в этот момент сгенерировать так называемый ТОКЕН который мы и запишем сначало в базу, а потом и пользователю в куки вместе с uniqid.
Далее, пользователь качает ключик, и сохраняет его к примеру на флешке для дальнейшего использования.
Этап третий, авторизация.
Как мы помним у пользователя мы записали uniqid и токен в куки, то есть создали связку токен и uniqid и теперь мы спокойно можем проверять это по базе(стандартный метод )) и если есть такая связка то считаем пользователя авторизованным, если нету то чистим куки и считаем пользователя гостем.
Страница авторизации выглядит так, пользователю дается всего одно поле!!!(легкость авторизации) для выбора файла ключей, после того как пользователь выбрал файлик ключей и жмет отправить, то осуществляем отправку файлика на сервер и там уже получаем его хеши(что дает еще одну гарантию безопасности)
После получения хеша файлика, мы проверяем его по базе и если такой хеш находим то опять даем пользователю uniqid и ГЕНЕРИРУЕМ НОВЫЙ ТОКЕН, тем самым убиваем старую авторизацию(если она была на другом устройстве), если же хеш не найден по базе то для этого есть таблица(назовем например errors) куда мы и запишем хеш файла, для того чтобы потом админ мог просмотреть логи и отследить попытки взлома.
Ну а далее можно мне и не писать, идет все стандартное.
Итог, с помощью такой авторизации мы убиваем массу проблем, и это дает нам гарантию того что.
1 Аккаунт не смогут ломануть методом подбора(вы прикиньте, чел сидит и генерирует разные картинки, и потом льет их на сервак чтобы попробовать ломануть.))(смотрите пункт 2 в первом посте)
2 Аккаунт не сможет использоваться одновременно с двух девайсов или браузеров, то есть даже если у пользователя смогли увести куки то ему достаточно нажать кнопку выход и тогда все куки станут негодными.(смотрите пункт 4 в перовм посте))
3 Пользователю не нужно запоминать пароли и логины, у него есть ключик для этого.(прост в использовании, пункт 1)
4 Этот метод анонимен, так как мы не используем никаких сторонних сервисов для авторизации(пункт 3)
Итак, получается что смогли выполнить все требования заказчика, плюс получили еще пару фишек и удобств.
К примеру, даже если пользовательский девайс заражен каким либо вирусом, то я пока редко встречал вирусы которые сливают все картинки или же фотки с компа, да и отследить то что у вас сливают чтото в таких обьемах проще чем например 1 txt файлик обьемом 1-2 кило.
При авторизации мы не принимаем от пользователя ничего, кроме файла, который будет проверятся на сервере, который невозможно будет исполнить и в который даже если и воткнуть вредоносный код то все равно от него толку ноль ибо ниче такое мы не берет от файла, по сути мы его даже не читаем и не выводим в браузер, мы только лиш получаем его хеш суммы и все.
Ну в общем как то так, а вот теперь хотелось бы услышать ваше мнение, пожелания и критику.
Спасибо за уделенное внимание.
есть черви, которые все картинки заменяют на картинку с рекламой, нужно какой нибудь уникальный формат, как организовать восстановление пароля? мыло по сути использовать не безопасно
# Koenig (27.08.2013 / 06:45)
есть черви, которые все картинки заменяют на картинку с рекламой, нужно какой нибудь уникальный формат, как организовать восстановление пароля? мыло по сути использовать не безопасно
Насчет червей то я так понимаю это проблема уже самого пользователя, и тот кто работает с биткоинами просто должен знать о простейших мерах безопасности.
Востановление пароля сугубо через тикеты и котрольное вопрос слово.
# UA95 (27.08.2013 / 07:10)
Не пойдёт,ибо захочешь зайти с другого компа,флешки нет,чё делать?Востанавливать картинку?
При авторизации давай уникальный ключ в куки и записуй его в БД,и ещё капчу выводи если ввёл неверный паро
1 Насчет зайти с другого компа и нету флешки, то скажи мне, ты часто на левых компа авторизуешься на таких сервисах где у тебя лежать большие суммы?
Даже если учесть наличие пары компов(работа, дом) то ты должен заранее об этом позаботится.
2 Давать уникальный ключ, это тоже самое что давать просто токен, в случае если у тебя увели куки(могут это делать даже целенаправленно) то они смогут подменив куки войти под тобой.
3 Зачем делать лишние телодвижения(ввод логина, пароля, каптчи) да и опять же про вирусы, есть такие вирусы шпионы которые запоминают все что ты вводишь на конкретном сайте(опять же целенаправленно) то есть вводя логин парроль нет уверености о том что у тебя их не перехватят.
Опять же повторюсь ребят, вы не сравнивайте обычные сайты для общения, где нет фактически никакой ценной информации, с сайтом в котором висят большие, неконтролируемые суммы, те кто знают про биткоины меня должны понять о чем разговор.
У заказчика только на его балансе ~27 биткоинов а это примерно $3477.87 курс $128.81 / 1BTC и это не считая вкладчиков, это тоже примерно ~17 биткоинов
Мне кажется, что запомненный(записанный на бумажке) пасс, самое безопасное.
// что в твоем варианте мешает стырить картинку то? способов миллиард. вплодь до того что пользователь сам ее принесет ))