Какой алгоритм я должен использовать для шифрования и встраивания пароля для приложения? - PullRequest
1 голос
/ 14 июня 2010

Какой алгоритм я должен использовать для шифрования и встраивания пароля для приложения?

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

Объект Паскаль был бы хорош.

Major Edit

Я думаю, что не объяснил себя достаточно хорошо. Пароль необходимо расшифровать обратно в исходную форму и применить. Само приложение использует локальную базу данных SQL и локальный веб-сервер, и пароль является фиксированным и не может быть изменен конечными пользователями. Это сделано для того, чтобы изменения вносились только из самого приложения. Пароли пользователей разрешают доступ только к самому приложению, а не к базе данных

/ vfclists

Ответы [ 7 ]

1 голос
/ 14 июня 2010

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

Конечно, этот подход является простым решением, которое не позволяет вам получить пароль, еслион потерян, но он должен работать довольно хорошо, если вам просто нужна некоторая защитакак SHA-2 (512/384), который является более надежным.Я просто хотел объяснить подход больше, чем использование конкретного алгоритма хеширования.

0 голосов
/ 05 октября 2014

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

Если ваша программа может быть декомпилирована (например, Java, но я не знаю о других языках, таких как C, C ++), то человек, который имеет ваше приложение, сможет увидеть исходный код. Как только они это получат, наверняка найдется способ узнать имя пользователя и пароль. Даже если ваш исходный код сохранил пароль с использованием обратимого алгоритма шифрования, человек, который хранит ваш исходный код, сможет написать код, аналогичный вашему, чтобы отменить шифрование и обнаружить пароль.

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

Вместо этого я считаю, что вам нужно разделить ваше приложение на клиентские и серверные приложения. Вы можете написать спокойное веб-приложение или использовать службу обмена сообщениями (например, JMS) и написать клиентское приложение, которое его использует.

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

============== Подход хеширования, мой оригинальный ответ ============

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

Использование SHA1 или SHA2 со значением соли может быть довольно сильным, но есть даже более сильные методы. Я настоятельно рекомендую вам прочитать этот раздел руководства по безопасности пружины . Я не думаю, что вы используете Spring или Java, но этот раздел очень хорошо охватывает концепции. Позвольте мне перефразировать:

  1. Используйте как минимум 8-байтовое значение соли, было бы здорово до 16 байт. Значение соли должно быть разным для каждого аккаунта. Если он одинаков, взломщику нужно будет создать только один радужный стол! Это должно быть случайно сгенерировано. В документации об этом не говорится, но я также рекомендую использовать безопасный генератор случайных чисел, не используйте начальное число случайных чисел, которое дает последовательную последовательность чисел.
  2. Вы должны хешировать пароль несколько раз, потому что это приведет к тому, что попытки взлома паролем будут занимать все больше времени. Действительно, вам может потребоваться медленный алгоритм кодирования паролей вместо быстрого.
  3. Храните сырое значение соли в базе данных вместе с паролем, вы даже можете сохранить его в том же поле / столбце. Это необходимо, чтобы пароли можно было проверить в будущем.

Хороший пример этого - BCryptPasswordEncoder .

===============

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

0 голосов
/ 01 июля 2010

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

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

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

0 голосов
/ 14 июня 2010

Я подозреваю, что вы стремитесь не хранить пароли в приложении, а пытаться предотвратить запуск самого приложения без пароля, как формуDRM.Если это так, и вы хотите заблокировать людей с помощью отладчиков, я думаю, что вам нужно либо аппаратный ключ, либо сетевой замок.Вдобавок ко всему, я знаю, что SafeNet несут продукты, которые делают это (и я имел некоторое знакомство с ними в прошлом, они кажутся приличными), но я не знаю, насколько хорошо они сравниваются с остальным рынком.

0 голосов
/ 14 июня 2010

Я бы предложил SHA1, одностороннее шифрование, я использовал его раньше, и, безусловно, никто не расшифровал его! Если вам нужна дополнительная информация о sha1, посетите http://en.wikipedia.org/wiki/Secure_Hash_Algorithm и http://www.openssl.org/docs/crypto/sha.html.

PS: если вы используете php, вы можете просто зашифровать с помощью SHA1 с помощью sha1 (); работать!

0 голосов
/ 14 июня 2010

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

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

0 голосов
/ 14 июня 2010

SHA должно быть хорошо для вас, лучше всего с солью.

Я не очень хорошо знаю Object Pascal, но, вероятно, это поможет вам: http://sourceforge.net/projects/op-crypt/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...