Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
grom_oleg
21 / 21 / 7
Регистрация: 24.01.2013
Сообщений: 129
1

Хранение пароля

12.06.2013, 20:07. Просмотров 4131. Ответов 16
Метки нет (Все метки)

Здравствуйте!Возникла такая проблема:есть программа, где требуется вводить логин/пароль от сервера.
При этом, должна быть возможность запоминания логина/пароля(чекбокс)
Мне предложили AES-шифрование, но для него требуется не только исходная строка, но и ключ(пароль).
Так вот, проблема в том, что ключ тоже надо где-то хранить, причем надежно.
Есть соображения?


Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 20:07
Ответы с готовыми решениями:

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

Хранение пароля в зашифрованном виде
Написал программку для монтирование контейнера truecrypt от имени другого...

Хранение пароля от SMTP в App.config
Кинул другу уже готовую сборку .exe где при его запуске с его машины я...

Наиболее надежное хранение настроек и пароля
Здравствуйте друзья. Как будет правильно (более грамотно, безопасно)...

Хранение классов
В чем отличие хранения классов в исполняемом файле или в dll? Что лучше, как...

16
Ithilgwau
26 / 26 / 1
Регистрация: 19.09.2012
Сообщений: 123
12.06.2013, 20:14 2
Пароли обычно не хранят ни напрямую, ни в зашифрованном виде. Обычно хранят только хэш паролей. Но хэш тоже может быть с ключом. Ключ обычно прописывают в App.config или Web.config, а ещё чаще для этого используются MachineKey, который и так там прописывается.
1
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.06.2013, 20:19 3
Вы можете использовать статический ключ, "зашитый в программу".
Это довольно часто встречающийся способ.
Но можно сделать сильнее, используя в качестве ключа имя сервера, например.
А вообще, в Windows для таких целей есть специальный программный интерфейс,
называется Data Protection API (DPAPI):
http://msdn.microsoft.com/en-us/library/ms995355.aspx
В .NET он, само собой, тоже поддерживается: Protection Data Class.

Добавлено через 1 минуту
Вы можете использовать имя сервера в качестве энтропии.
Так поступает, например, Internet Explorer для хранения паролей к сайтам.
1
grom_oleg
21 / 21 / 7
Регистрация: 24.01.2013
Сообщений: 129
12.06.2013, 20:30  [ТС] 4
Цитата Сообщение от Убежденный Посмотреть сообщение
Вы можете использовать статический ключ, "зашитый в программу".
Это довольно часто встречающийся способ.
Но можно сделать сильнее, используя в качестве ключа имя сервера, например.
А вообще, в Windows для таких целей есть специальный программный интерфейс,
называется Data Protection API (DPAPI):
http://msdn.microsoft.com/en-us/library/ms995355.aspx
В .NET он, само собой, тоже поддерживается: Protection Data Class.

Добавлено через 1 минуту
Вы можете использовать имя сервера в качестве энтропии.
Так поступает, например, Internet Explorer для хранения паролей к сайтам.
зашить ключ в прогу - все равно, что выложить его в инет
0
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.06.2013, 20:34 5
Цитата Сообщение от grom_oleg Посмотреть сообщение
зашить ключ в прогу - все равно, что выложить его в инет
Вы, видимо, не до конца меня поняли. Речь идет о ключе шифрования, а не о пароле.
Так поступает, к примеру, программа TightVNC - пароль хранится в реестре, в зашифрованном
виде, а ключ шифрования "прошит" в самой программе.
А более надежный способ выше - DPAPI.
1
Ithilgwau
26 / 26 / 1
Регистрация: 19.09.2012
Сообщений: 123
12.06.2013, 20:45 6
Цитата Сообщение от grom_oleg Посмотреть сообщение
зашить ключ в прогу - все равно, что выложить его в инет
С какой стати? Чтобы взломать пароли, нужно сначала получить вашу программу (желательно исходники), вы же не собираетесь её выкладывать в инет? А после этого нужно будет ещё и взломать сервер с базой, где у вас пароли хранятся
1
phantom96
MЫW
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
12.06.2013, 20:48 7
Цитата Сообщение от Ithilgwau Посмотреть сообщение
С какой стати? Чтобы взломать пароли, нужно сначала получить вашу программу (желательно исходники), вы же собираетесь её выкладывать в инет? А после этого нужно будет ещё и взломать сервер с базой, где у вас пароли хранятся
Цитата: .net и java - опенсорс поневоле.
Любой рефлектор вытащит любой string из C# программы.
0
Ithilgwau
26 / 26 / 1
Регистрация: 19.09.2012
Сообщений: 123
12.06.2013, 20:53 8
Кстати говоря, если хранить хэш, то восстановить пароли в принципе невозможно. Поэтому если вам нужно только проверять авторизацию и не нужно никому эти пароли потом показывать, хэш - идеальный вариант.

Добавлено через 3 минуты
Цитата Сообщение от phantom96 Посмотреть сообщение
Цитата: .net и java - опенсорс поневоле.
Любой рефлектор вытащит любой string из C# программы.
Ну да, а вы собираетесь эту программу всем давать? Это эта программа работает на сервере, то нет проблем.

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

Всё зависит от того, что это за приложение - серверное или клиентское. И может ли кто-то неправомерно получить доступ к машине, на которой работает приложение. Если это серверное веб-приложение, например, то даже вшитый ключ в общем-то безопасен. Тем более, если юзать хэш.
0
phantom96
MЫW
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
12.06.2013, 21:13 9
При этом, должна быть возможность запоминания логина/пароля(чекбокс)
Вы думаете такая гадость на сервере лежит?
0
Ithilgwau
26 / 26 / 1
Регистрация: 19.09.2012
Сообщений: 123
12.06.2013, 21:24 10
Цитата Сообщение от phantom96 Посмотреть сообщение
Вы думаете такая гадость на сервере лежит?
Ну откуда ж я знаю Если это не веб-приложение, генерируйте действительно ключ случайным образом при запуске программы...
0
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
12.06.2013, 21:55 11
Цитата Сообщение от Ithilgwau Посмотреть сообщение
Кстати говоря, если хранить хэш, то восстановить пароли в принципе невозможно. Поэтому если вам нужно только проверять авторизацию и не нужно никому эти пароли потом показывать, хэш - идеальный вариант.
Знание хэша во многих случаях эквивалентно знанию пароля. Поэтому данный способ имеет
ограниченное применение. Например, проверить, что пароль "правильный". Да и в этом случае
нужно, как минимум, позаботиться о выборе стойкой хэш-функции, и использовать "соль".
1
Ithilgwau
26 / 26 / 1
Регистрация: 19.09.2012
Сообщений: 123
12.06.2013, 22:04 12
Цитата Сообщение от Убежденный Посмотреть сообщение
Знание хэша во многих случаях эквивалентно знанию пароля. Поэтому данный способ имеет
ограниченное применение. Например, проверить, что пароль "правильный". Да и в этом случае
нужно, как минимум, позаботиться о выборе стойкой хэш-функции, и использовать "соль".
Да, я и имел в виду хэш с солью (по ошибке назвав её ключом). И если ему не нужно ничего, кроме как проверить, что пароль правильный, шифрование ему не нужно.
0
grom_oleg
21 / 21 / 7
Регистрация: 24.01.2013
Сообщений: 129
13.06.2013, 19:41  [ТС] 13
Цитата Сообщение от Ithilgwau Посмотреть сообщение
Кстати говоря, если хранить хэш, то восстановить пароли в принципе невозможно. Поэтому если вам нужно только проверять авторизацию и не нужно никому эти пароли потом показывать, хэш - идеальный вариант.

Добавлено через 3 минуты


Ну да, а вы собираетесь эту программу всем давать? Это эта программа работает на сервере, то нет проблем.

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

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

Добавлено через 1 минуту
Цитата Сообщение от Убежденный Посмотреть сообщение
Знание хэша во многих случаях эквивалентно знанию пароля. Поэтому данный способ имеет
ограниченное применение. Например, проверить, что пароль "правильный". Да и в этом случае
нужно, как минимум, позаботиться о выборе стойкой хэш-функции, и использовать "соль".
У меня есть код алгоритма для шифрования строки с заданным ключом и солью.Вопрос в том, как надежно сохранить соль и ключ к строке, не прибегая к "вшиванию"

Добавлено через 1 минуту
Цитата Сообщение от Ithilgwau Посмотреть сообщение
С какой стати? Чтобы взломать пароли, нужно сначала получить вашу программу (желательно исходники), вы же не собираетесь её выкладывать в инет? А после этого нужно будет ещё и взломать сервер с базой, где у вас пароли хранятся
Приложение клиентское и к тому же будет стоять на нескольких компьютерах, где будут работать незнакомые люди и неизвестно, что они захотят сделать

//
Насчет этой ссылки, думаю, мне подходит.Я попробую и отпишусь.Всем спасибо
0
Ithilgwau
26 / 26 / 1
Регистрация: 19.09.2012
Сообщений: 123
13.06.2013, 19:46 14
Да, если приложение клиентское, это многое меняет...
0
SkoTi
-20 / 5 / 6
Регистрация: 03.10.2012
Сообщений: 532
13.06.2013, 20:09 15
Вобще хорошее хранение это SHA пороль... Это хешпароль который создаётся путём сложения логина и пароля после добовление реверса и после уже генерирование в хэш))
0
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
13.06.2013, 20:29 16
Цитата Сообщение от grom_oleg Посмотреть сообщение
У меня есть код алгоритма для шифрования строки с заданным ключом и солью.
Вопрос в том, как надежно сохранить соль и ключ к строке, не прибегая к "вшиванию"
Эта проблема в общем случае не решаема.
Зашифруете пароль - нужно будет где-то хранить ключ шифрования. Можно и ключ тоже
зашифровать, но тогда нужно заботиться о ключе шифрования для ключа шифрования, и т.д.

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

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

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

Такую схему легко реализовать самому, например на основе все того же AES.
Но я рекомендую использовать именно DPAPI, и вот почему.

1) Программный интерфейс DPAPI предельно прост.
Грубо говоря, там всего две функции - Protect и Unprotect.
Нужно лишь выбрать правильную энтропию (см. выше).

2) DPAPI использует только сильные криптоалгоритмы и тщательно заботится о всех
"секретах" - память для паролей и ключей зануляется сразу после использования и
никогда не сбрасывается на диск.

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

DPAPI для решения этой проблемы использует специальную функцию генерации ключа,
которая значительно увеличивает время, необходимое на выполнение полного перебора:
Password-Based Key Derivation Function, PKCS #5.

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

Короче говоря, для параноиков от безопасности - самое то
2
grom_oleg
21 / 21 / 7
Регистрация: 24.01.2013
Сообщений: 129
13.06.2013, 21:58  [ТС] 17
Так и сделал(через DPAPI)
По поводу имени сервера - не вариант, т.к. логин тоже надо хранить.
Спасибо всем, кто помог, все работает
0
13.06.2013, 21:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 21:58

Хранение таблиц
Добрый вечер. Подскажите, как лучше хранить таблицу, следующего вида: ...

Хранение значений
Здравствуйте, в c# новичок, подскажите пожалуйста. Мне нужно хранить значения...

Хранение структуры
Почему здесь структура хранится в куче using System; // Структуры. //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru