Ищете безопасный портативный способ хранения паролей

Я работаю над проектом C++, который должен работать как на Win32, так и на Linux, программное обеспечение должно быть развернуто на небольших компьютерах, обычно работающих в удаленных местах - каждая машина, вероятно, будет содержать свой собственный пул пользователей/обслуживающих. .

Недавно наш клиент обратился к нам с просьбой ввести контроль доступа с помощью защиты паролем.

Мы должны соответствовать следующим критериям:

  • Поддержка удаленного входа
  • Поддержка удаленной смены пароля
  • Поддержка удаленного сброса пароля ОТРЕДАКТИРОВАНО
  • Поддержка извлечения данных при случайном/преднамеренном удалении
  • Поддержка безопасного хранения

Я могу удовлетворить «удаленные» требования, используя существующую библиотеку, однако мне нужно рассмотреть метод хранения этих данных, желательно таким образом, чтобы он работал на обеих платформах и не позволял пользователю видеть это/ прочтите, здесь проблема не в шифровании, а в самом методе хранения.

Может ли кто-нибудь порекомендовать безопасный метод хранения, который поможет мне соответствовать этим критериям?

РЕДАКТИРОВАТЬ

Мы изначально рассматриваем возможность использования переносимой базы данных SQLite, однако нас интересует ограничение доступа к файлу с данными для пользователей. Как мы можем этого добиться? (файл не виден пользователю, файл не может быть открыт пользователем вручную и т. д.)

РЕДАКТИРОВАТЬ 2

Приветствую ответы, поступающие до сих пор. Можем ли мы сосредоточиться на способах ограничения доступа к самому файлу? Шифрование здесь не при чем. Мы ищем способ скрыть или сделать резервную копию файла и разрешить работать с ним только «MyApp.exe».

Пока мы также изучаем альтернативные потоки NTFS, однако мы не уверены, будет ли это работать в Linux.


person Maciek    schedule 08.04.2010    source источник
comment
Безопасный метод хранения - хранить его в кошельке или в сейфе ;)   -  person klew    schedule 08.04.2010
comment
Не существует безопасного способа для механизма хранения паролей поддерживать удаленный поиск паролей. Это требует хранения пароля в виде простого текста, что небезопасно.   -  person jemfinch    schedule 08.04.2010
comment
Чем зашифрованная база данных SQLite отличается от зашифрованного чего-либо еще? Насчет ограничения доступа определенным пользователям: для этого и нужны пароли... (чтобы не было видно, разместите в сети и просто ограничьте доступ определенным пользователям)   -  person BlueRaja - Danny Pflughoeft    schedule 08.04.2010
comment
Будут ли они удовлетворены удаленным СБРОСОМ пароля, а не его извлечением? В противном случае вы откроете целую банку паролей, эквивалентных открытому тексту.   -  person Mark B    schedule 08.04.2010
comment
Да, СБРОС, а не поиск   -  person Maciek    schedule 09.04.2010


Ответы (6)


Вы можете использовать базу данных SQLite. Поскольку это всего лишь файл, вы можете использовать стандартные права доступа к файлам, чтобы ограничить доступ. например chmod 600 foo.dbs ограничит доступ к файлу, чтобы только владелец мог читать и писать в него.

Затем, как предлагали другие, вы храните хешированный пароль в базе данных, и он будет достаточно безопасным.

Ходят слухи, что существует коммерческая версия SQLite, которая шифрует весь файл базы данных. Однако это не должно быть заменой хранения хешированных паролей, а просто дополнением к хешированию.

изменить: вот ссылка на коммерческая версия sqlite с поддержкой шифрования всей БД.

person Glen    schedule 08.04.2010
comment
Мы склоняемся к этому пути, однако нам нужно как-то ограничить доступ к этому файлу. - person Maciek; 08.04.2010
comment
@Maciek, для этого нужны разрешения на основе файлов. Мой ответ показывает, как это сделать в Unix/Linux. Для окон вы должны спросить кого-то, кто знает это лучше, чем я. - person Glen; 08.04.2010

Для входа в систему вы хотите сохранить повторный соленый хэш пароля, а не сам пароль. Две возможности:

  • bcrypt — модифицированная форма иглобрюха, увеличивающая коэффициент работы.
  • PBKDF2 — функция из спецификации PKCS#5, которая использует HMAC с хеш-функцией и случайной солью для многократного повторения пароля.

Однако это не будет работать с вашими требованиями:

  • Поддержка удаленного восстановления пароля

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

  • Поддержка извлечения данных при случайном/преднамеренном удалении

Это требование сложнее обойти, и вам потребуется ослабить безопасность, сохранив зашифрованные пароли в базе данных, чтобы их можно было отменить. Для этого вы должны использовать мастер-ключ, зашифровать каждый пароль случайным IV, используя шифр, такой как режим AES/CBC или AES/CTR. Вы должны регулярно менять главный ключ и заново шифровать все пароли. Затем вам понадобится механизм для определения того, когда разрешить извлечение пароля (например, девичью фамилию матери и т. д.).

Чтобы использовать пароль для шифрования данных, используйте функцию PKDF2 из PKCS#5 для создания ключа из пароля.

person Dean Povey    schedule 08.04.2010
comment
Это сброс, а не поиск. Спасибо, что подняли это - person Maciek; 08.04.2010

Никогда не сохраняйте сам пароль. Хэшируйте пароль с помощью соли и сохраните его.

person sbi    schedule 08.04.2010
comment
Это был не совсем мой вопрос - person Maciek; 08.04.2010
comment
Я думаю, что это ответ на ваш вопрос, но, возможно, частично. Всегда храните хешированные пароли. Конечно, вы не можете прочитать его, и даже компьютер не может его прочитать (по крайней мере, за достаточно короткое время). Если ваш компьютер может что-то прочитать, то и человек сможет. - person klew; 08.04.2010
comment
+1, поскольку sbi совершенно правильно, если вы действительно беспокоитесь о безопасности пароля (а это не всегда так, иногда хранение самого пароля нормально, если удобство перевешивает риск), тогда вам нужно использовать соленый хэш. - person Cruachan; 08.04.2010

Я не совсем уверен, что полностью понимаю ваш вопрос. Но в любом случае. Как насчет настройки пользователя «FooUser» (при условии, что ваш продукт «Foo»). Сохраните файл/базу данных в месте с разрешениями на чтение/запись только для пользователя FooUser. Доступ к файлу/базе данных через сервис/демон, выдающий себя за FooUser.

person ur.    schedule 08.04.2010
comment
Это один из способов сделать это, я полагаю - person Maciek; 08.04.2010

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

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

person torak    schedule 08.04.2010
comment
Мы имеем дело с распределенной системой. Каждая машина имеет свой собственный пул пользователей/сервисменов - person Maciek; 08.04.2010

Я думаю, что правильный путь:

  • в памяти вы объединяете имя пользователя + пароль + какой-то файл cookie (скажем, меган фокс»).

Затем вы применяете к нему коммерческий хеш-алгоритм. Я использую SHA (System.Security.Cryptography.SHA1CryptoServiceProvider) из .NET Framework, но я уверен, что это не проблема заставить его работать на C++ или, возможно, получить его для C++.

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

Проблема в том, что вы не можете восстановить пароль. Но я думаю, что это что-то хорошее.

Надеюсь это поможет.

person Daniel Dolz    schedule 08.04.2010
comment
Это не ответ на вопрос :) - person Maciek; 08.04.2010
comment
Хорошо, я думаю, вам нужно зашифровать пароли, используя какой-нибудь хороший алгоритм. Проблема в том, что пароль должен быть где-то в коде. Я всегда считаю, что основными угрозами являются сотрудники, имеющие доступ к БД и аппаратной инфраструктуре, а не внешние злоумышленники. - person Daniel Dolz; 09.04.2010