Где хранить ключи шифрования
От: Spender Канада http://rybkov.livejournal.com
Дата: 22.09.06 08:08
Оценка:
Привет, Всем.

Я с помощью
RSACryptoServiceProvider

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

Ключи создаются так:
CspParameters keyParams = new CspParameters( );
keyParams.KeyContainerName = "Имя_хранилища";
RSACryptoServiceProvider provider = new RSACryptoServiceProvider( keyParams );

Что такое "Имя_хранилища"? Где оно находится?

Ещё я могу сохранять ключи вот так
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider( );
RSA.ToXmlString( true );

А потом читать их:
RSA.FromXmlString( someString );

А эта строка в открытом виде хранится на диске.
Хорошо ли это? Или это проблема пользователя хранить её в недоступном месте, чтобы никто файл не читал?
Re: Где хранить ключи шифрования
От: mrozov  
Дата: 22.09.06 08:49
Оценка:
Здравствуйте, Spender, Вы писали:


Насколько я помню.
Рекомендованные подходы:

1. Использовать стандартный подход с DPAPI. Тогда ключи — вообще не наша забота.
2. Хранить ключ в защищенной ветке реестра.
Re: Где хранить ключи шифрования
От: stump http://stump-workshop.blogspot.com/
Дата: 22.09.06 09:11
Оценка: 1 (1)
Здравствуйте, Spender, Вы писали:

S>Привет, Всем.


S>Я с помощью

S>
S>RSACryptoServiceProvider
S>

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

S>Ключи создаются так:

S>
S>CspParameters keyParams = new CspParameters( );
S>keyParams.KeyContainerName = "Имя_хранилища";
S>RSACryptoServiceProvider provider = new RSACryptoServiceProvider( keyParams );
S>

S>Что такое "Имя_хранилища"? Где оно находится?

Они хранятся в защищенном контейнере предоставляемом криптосервиспровайдером, в данном случае — RSACryptoServiceProvider-ом. Это в принципе хорошее место для хранения ключей. Но в случае с RSACryptoServiceProvider-ом есть один подвох. Ключи хранятся персонально для каждого пользователя и если запустить этот код от имени другого пользователя то получить ранее сохраненный ключ не получится (вылетает exception). Причем флаг CspProviderFlags.UseMachineKeyStore не помогает в этом случае. Не знаю баг это или фича, но к этому надо быть готовым (актуально для Framework 1.1).
Физически ключи хранятся на диске в профайле пользователя в каталоге Application Data\Microsoft\Crypto\RSA в файлах с гремучими названиями в виде гуидов и очень ограниченными NTFS пермишенами. Желательно их руками не трогать, там есть ключи которые использует IIS и еще бог знает кто...
Понедельник начинается в субботу
Re[2]: Где хранить ключи шифрования
От: Pavel M. Россия  
Дата: 22.09.06 11:03
Оценка:
Здравствуйте, stump, Вы писали:

S>Здравствуйте, Spender, Вы писали:


S>>Привет, Всем.


S>Физически ключи хранятся на диске в профайле пользователя в каталоге Application Data\Microsoft\Crypto\RSA в файлах с гремучими названиями в виде гуидов и очень ограниченными NTFS пермишенами. Желательно их руками не трогать, там есть ключи которые использует IIS и еще бог знает кто...


Получается, зная имя хранилища, я могу получить доступ к ключам, если запущу прогу из под определенного пользователя? Не хорошо, как-то =)
--------------------------
less think — do more
Re[3]: Где хранить ключи шифрования
От: stump http://stump-workshop.blogspot.com/
Дата: 22.09.06 11:07
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Здравствуйте, stump, Вы писали:


S>>Здравствуйте, Spender, Вы писали:


S>>>Привет, Всем.


S>>Физически ключи хранятся на диске в профайле пользователя в каталоге Application Data\Microsoft\Crypto\RSA в файлах с гремучими названиями в виде гуидов и очень ограниченными NTFS пермишенами. Желательно их руками не трогать, там есть ключи которые использует IIS и еще бог знает кто...


PM>Получается, зная имя хранилища, я могу получить доступ к ключам, если запущу прогу из под определенного пользователя? Не хорошо, как-то =)


То то и оно, что надо знать не только имя контейнера но и имя и пароль пользователя.
Понедельник начинается в субботу
Re[4]: Где хранить ключи шифрования
От: Pavel M. Россия  
Дата: 22.09.06 11:11
Оценка:
Здравствуйте, stump, Вы писали:

S>Здравствуйте, Pavel M., Вы писали:



PM>>Получается, зная имя хранилища, я могу получить доступ к ключам, если запущу прогу из под определенного пользователя? Не хорошо, как-то =)


S>То то и оно, что надо знать не только имя контейнера но и имя и пароль пользователя.


Взглянем со стороны злоумышленника =) Можно не знать имя пользователя и пароль, но найти уязвимость ПО,позволяющую уже запущенному приложению запустить ПО злоумышленника.

А права доступа к папке с ключами и самому можно настроить!
--------------------------
less think — do more
Re[5]: Где хранить ключи шифрования
От: stump http://stump-workshop.blogspot.com/
Дата: 22.09.06 11:20
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Здравствуйте, stump, Вы писали:


S>>Здравствуйте, Pavel M., Вы писали:



PM>>>Получается, зная имя хранилища, я могу получить доступ к ключам, если запущу прогу из под определенного пользователя? Не хорошо, как-то =)


S>>То то и оно, что надо знать не только имя контейнера но и имя и пароль пользователя.


PM>Взглянем со стороны злоумышленника =) Можно не знать имя пользователя и пароль, но найти уязвимость ПО,позволяющую уже запущенному приложению запустить ПО злоумышленника.


Но это будет не наша уязвимость.

PM>А права доступа к папке с ключами и самому можно настроить!


Когда мы рассуждаем о безопасности, всегда надо понимать где следует остановиться чтобы не впасть в паранойю. Все о чем ты говоришь, лежит уже за пределами нашей системы. Мы просто принимаем допущение, что система работает в безопасном окружении. Чтобы сменить права доступа к той папке где лежат контейнеры криптопровайдера, надо обладать правами админа. Не существует защиты от злоумышленника с правами админа!
Понедельник начинается в субботу
Re[6]: Где хранить ключи шифрования
От: Pavel M. Россия  
Дата: 22.09.06 11:45
Оценка:
Здравствуйте, stump, Вы писали:

S>Здравствуйте, Pavel M., Вы писали:



S>Когда мы рассуждаем о безопасности, всегда надо понимать где следует остановиться чтобы не впасть в паранойю. Все о чем ты говоришь, лежит уже за пределами нашей системы. Мы просто принимаем допущение, что система работает в безопасном окружении. Чтобы сменить права доступа к той папке где лежат контейнеры криптопровайдера, надо обладать правами админа. Не существует защиты от злоумышленника с правами админа!


Я говорю о том, что человек, увидевший в моем ПО дыру, может попробовать запустить приложение с правами, с которыми запущено мое приложение и получить доступ к хранилищу =) А если я отвечаю за развертку приложения и разработку системы безопасности, а также за предварительную настройку сервера, то и за потерю денег и информации буду отвечать я, хотя бы частично =))) Так что параноя уместна! =)))
--------------------------
less think — do more
Re[7]: Где хранить ключи шифрования
От: stump http://stump-workshop.blogspot.com/
Дата: 22.09.06 12:04
Оценка:
Здравствуйте, Pavel M., Вы писали:

PM>Я говорю о том, что человек, увидевший в моем ПО дыру, может попробовать запустить приложение с правами, с которыми запущено мое приложение и получить доступ к хранилищу =) А если я отвечаю за развертку приложения и разработку системы безопасности, а также за предварительную настройку сервера, то и за потерю денег и информации буду отвечать я, хотя бы частично =))) Так что параноя уместна! =)))

А я говорю что контейнер криптопровайдера — это надежное хранилище для ключа.
Можно например не хранить имя контейнера в коде приложения а попросить ввести его пользователю при первом запуске приложения а потом зашифровать паролем пользователя и хранить зашифрованным.
На это можно ответить что если злоумышленник узнает пароль пользовател.... Или можно снять дамп во время работы приложения и вычислить расшифрованное имя контейнера. И так до бесконечности.
Понедельник начинается в субботу
Re: Где хранить ключи шифрования
От: Аноним  
Дата: 22.09.06 10:59
Оценка:
>> Причем флаг CspProviderFlags.UseMachineKeyStore не помогает в этом случае. Не знаю баг это или фича
Не баг. Если этот флаг установлен, то, как и обещано, контейнер создастся не в персональном \..\RSA, а в общем \All Users\..\MachineKeys.
Исключение, которое при этом все-таки возникает объясняется отсутствием прав доступа к контейнеру у нового пользователя. Установите для него Read(как минимум) permission на файл контейнера.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Где хранить ключи шифрования
От: Аноним  
Дата: 22.09.06 11:40
Оценка:
>> Причем флаг CspProviderFlags.UseMachineKeyStore не помогает в этом случае. Не знаю баг это или фича
Не баг. Если этот флаг установлен, то, как и обещано, контейнер создастся не в персональном \..\RSA, а в общем \All Users\..\MachineKeys.
Исключение, которое при этом все-таки возникает объясняется отсутствием прав доступа к контейнеру у нового пользователя. Установите для него Read(как минимум) permission на файл контейнера.

Как оказалось, старый добрый Aspnet_regiis -pa .. это и делает.

>> Взглянем со стороны злоумышленника =) Можно не знать имя пользователя и пароль, но найти уязвимость ПО,позволяющую уже запущенному приложению запустить ПО злоумышленника.
Тогда вас должно успокоить наличие Smart Cards, USB-tokens и Crypto Accelerators.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.