Шифрование паролей в Delphi

Мне нужно хранить пароли базы данных в файле конфигурации. По понятным причинам я хочу их зашифровать (желательно с помощью AES). Кто-нибудь знает реализацию Delphi, которую легко внедрить в существующий проект с> 10 000 строк исторически сложившегося (URGH!) Исходного кода?

Уточнение: «Легко» означает добавление блока в проект, добавление макс. 5 строк кода, в которых читается файл конфигурации, и все готово. Не должно занимать более 15 минут.

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

Какая база данных? В настоящее время существуют более эффективные способы подключения, чем использование простых старых пар пользователь / пароль.

user160694 13.10.2010 11:15

Если вы используете Windows, вы можете проверить эту статью: [Безопасный способ сохранить пароль в Windows] [1] [1]: stackoverflow.com/questions/13145112/…

wittrup 12.09.2013 04:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
2
18 088
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

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

Вам нужен односторонний хеш.

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

Jim McKeeth 25.09.2008 20:09

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

Treb 05.11.2008 10:56

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

user160694 13.10.2010 11:14
Ответ принят как подходящий

Я поддерживаю рекомендацию Дэвида Бартона Библиотека DCPCrypt. Я успешно использовал его в нескольких проектах, и это займет не более 15 минут после того, как вы прочитаете примеры использования. Он использует лицензию MIT, поэтому вы можете свободно использовать его в коммерческих проектах и ​​в других целях. DCPCrypt реализует ряд алгоритмов, в том числе Rijndael, который является AES.

Также существует множество автономных (одноуровневых) реализаций googlable - вопрос в том, какой из них вы доверяете, если только вы не готовы самостоятельно проверить исправность конкретной библиотеки.

DCPCrypt великолепен. Я использую его во многих местах.

gabr 25.09.2008 18:10

Для чего стоит (в таком старом потоке) я только что установил DCPcrypt и работает фантастически.

dpant 31.01.2012 20:04

Ссылка не найдена, пожалуйста, обновите ее

GBg 20.01.2021 20:46

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

Думаю, Turbopower LockBox - отличная библиотека для криптографии:

http://sourceforge.net/projects/tplockbox/

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

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

user160694 13.10.2010 11:05

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

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

Если вы решите использовать MD5, вы можете использовать MessageDigest_5.pas, который поставляется с Delphi (по крайней мере, он включен в мою копию Delphi 2007). Есть также другие реализации с исходным кодом Delphi, из которых вы можете выбрать.

+1 за упоминание hashing и опасностей хранения паролей. Никогда не храните пароли (даже не думайте их шифровать!).

Jeroen Wiert Pluimers 13.10.2010 13:52

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

Eric G 26.08.2014 20:59

У Тандрея правильный подход. Никогда не следует хранить пароль с помощью обратимого шифра. Как было правильно указано, если ваш «главный» ключ был когда-либо скомпрометирован, вся система будет скомпрометирована. Использование необратимого хеша, такого как MD5, намного безопаснее, и вы можете сохранить хешированное значение в виде открытого текста. Просто хешируйте введенный пароль, а затем сравните его с сохраненным хешем.

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

Treb 05.11.2008 10:55

Просто напоминание.

Если вам не нужно взаимодействовать с другими библиотеками шифрования, то DCP или LockBox сделают эту работу.

НО

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

Я всегда пользуюсь Turbopower Lockbox. Он хорошо работает и очень прост в использовании. На самом деле я использую его для того же самого, сохраняя пароль в текстовом файле конфигурации.

http://sourceforge.net/projects/tplockbox/

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

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

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

Хеширование не вариант, мне нужен пароль, чтобы установить соединение с базой данных. Я вообще не контролирую БД. Но спасибо за подробное объяснение!

Treb 05.11.2008 10:57

Я рекомендую использовать какую-нибудь соль. Не храните крипту (пароль) в файле конфигурации, а храните крипту этого хранилища (соль + пароль). В качестве «соли» вы можете использовать то, что требуется для открытия базы данных, например. db_name + user_name. Для функции шифрования вы можете использовать какой-нибудь хорошо известный алгоритм, как AES, Idea, DES, или что-то более простое, например, скоринг каждого байта с байтом из какой-то другой строки, эта строка будет вашим ключом. Чтобы сделать решение более разным, вы можете использовать несколько случайных байтов и хранить их.

Итак, чтобы хранить:

  1. init_str: = 5 случайных байтов
  2. новый_пароль: = соль + пароль // соль: = имя_бд + имя_пользователя
  3. crypted_password = xor_bytes (init_str + new_password, 'моя ключевая фраза')
  4. crypted_password: = init_str + crypted_password
  5. сохраните crypted_password в конфигурации, так как это будут байты, которые вы можете изменить или base64

И для подключения:

  1. разделить данные, считанные из конфигурации, на init_str и crypted_password
  2. new_password = xor_bytes (init_str + crypted_password, 'моя ключевая фраза')
  3. пароль: = удалить (db_name + user_name) из new_password

TurboPower LockBox 3 (http://lockbox.seanbdurkin.id.au/) использует автоматическое соление. Я не рекомендую DCPCrypt Бартона, потому что IV не соленые. В некоторых ситуациях это очень серьезный недостаток защиты.

Вопреки предыдущему комментарию, реализация AES в LB3 полностью соответствует стандарту.

1) Стабильна ли версия 3? 2) Лицензия Mozilla была изменена на GPL3, и мне интересно, имеете ли вы на это право. Многие коммерческие разработчики предпочитают держаться подальше от библиотек GPL.

user160694 13.10.2010 14:31

1) Статус можно посмотреть на сайте; 2) Нет, это не так. Лицензии на одну из двух библиотек LockBox никогда не менялись. LockBox 2 выпущен под лицензией MPL; LockBox 3 выпущен под LGPL3 (не GPL). LB2 и LB3 не имеют общего исходного кода. Ни один коммерческий разработчик никогда не откажется от LGPL - это было бы просто нерационально.

Sean B. Durkin 22.10.2010 07:46

Пара решений:

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

Вам нужно сохранить его в месте, где доступ есть только у текущего пользователя.

В основном это можно сделать двумя способами:

  1. Сохраните его в Зашифрованный файл EFS.
  2. Сохраните его в безопасное локальное хранилище.

Internet Explorer использует 2. Но если вы можете получить локальный доступ, вы можете расшифровать как 1., так и 2., если у вас есть правильный главный ключ и алгоритм (например, iepv может получить пароли Internet Explorer).

Итак:
По возможности не храните пароли. Сначала поищите альтернативы (например, проверка подлинности Windows, службы каталогов и т. д.).

- Джерун

Демо Embarcadero дает простую, но достаточно сильную систему для большинства приложений: https://edn.embarcadero.com/article/28325

Другие вопросы по теме