Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Передача зашифрованного пароля между серверами  [new]
solitary
Member

Откуда:
Сообщений: 16
Здравствуйте, уважаемые!
Просьба не судить строго, хотела, чтобы Вы посоветовали мне какие-нибудь варианты реализации следующей задачи:
Есть главный сервер сети, версия 2008R2, а также несколько десятков удаленных серверов, версия серверов 2000. Серверы обмениваются данными в обе стороны, но обмен данными не ведется средствами MS SQL Server (нет ни репликации, ни связанных серверов), а производится, скажем, отдельно написанной утилитой. Задача же следующая: необходима возможность создавать пользователей базы данных на удаленных серверах, при условии того, что заводится они будут на сервере путем добавления в логинов и паролей в пользовательскую таблицу. Самый интересный момент этого действа - это то, что в данной пароль для каждого пользователя должен быть зашифрован. При этом его можно расшифровать, имея соответствующий доступ. Т.е. передается он в зашифрованном виде, расшифровывается на удаленном сервере, создаются логины... С помощью каких средств можно реализовать подобное? Нашла только два варианта:
1. Шифровать с помощью какой-нибудь пользовательской функции, текст которой будет скрыт (WITH ENCRYPTED), хотя тут незадача: ее нужно создать на всех серверах, т.е. ее код можно будет увидеть все равно в процессе разливки.
2. Шифровать с помощью симметричного ключа. Но вдруг до меня дошло, что MS SQL Server 2000 данной опции не поддерживает.
Подскажите, пожалуйста, какие существуют методы решения данной задачи, и вообще, насколько она реализуема?
Спасибо!
23 сен 14, 21:48    [16612881]     Ответить | Цитировать Сообщить модератору
 Re: Передача зашифрованного пароля между серверами  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
3. Использовать X509Certificate2 той же отдельной утилитой, пароль передавать зашифрованным по AES ключом, получаемым в сеансе обмена public-ключами. Подробности в MSDN.
23 сен 14, 22:56    [16613153]     Ответить | Цитировать Сообщить модератору
 Re: Передача зашифрованного пароля между серверами  [new]
solitary
Member

Откуда:
Сообщений: 16
Спасибо за информацию. Честно, чтобы подобное реализовать, мне еще учится и учится, да и я вообще где-то совсем не там... Интересуют варианты реализации чисто средствами MS SQL Server / T-SQL. Варианты "других способов нет" тоже принимаются (в случае уверенности в этом).
23 сен 14, 23:17    [16613251]     Ответить | Цитировать Сообщить модератору
 Re: Передача зашифрованного пароля между серверами  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
solitary
Варианты "других способов нет" тоже принимаются (в случае уверенности в этом).

В вашем случае это именно тот самый вариант. MSSQL поддерживает следующие варианты криптования данных:

1. По симметричному ключу. Допустим, у вас удаленные сервера имеют версию выше 2000 - но вам бы это никаким боком не помогло. Потому что данные у вас приходят извне, а серверное криптование по ключу работает только в пределах сервера, это вещь в себе, и для внешнего криптования таким образом, чтобы на сервере осуществить декриптование, нет никаких отправных точек - самого ключа, IV, cipher mode (CBC/CFB/CTS/etc), padding, и прочего. Я с этой проблемой уже сталкивался .

2. ENCRYPTBYPASSPHRASE / DECRYPTBYPASSPHRASE. Тоже не вариант - во-первых, поддерживается только с 2005-й версии. Во-вторых, для осуществления криптования/декриптования вам пришлось бы криптующую и декриптующую процедуры, содержащие парольную фразу, продеплоить на все связанные серверы, на каждом из которых по меньшей мере sa сможет увидеть парольную фразу - в результате имеем эту парольную фразу скомпрометированной на 99%. С т.з. секьюрности - решето.

3. Теперь то, о чем писал я. Процесс выглядит примерно так:
1. Устанавливаем на все удаленные сервера собственные X509-сертификаты.
2. Главный сервер (здесь и далее - утилита на удленном сервере) создает пользователя, генерирует для него пароль, и запрашивает у удаленного сервера открытый ключ.
3. Удаленный сервер высылает открытый ключ сертификата.
4. Главный сервер по полученному открытому ключу создает симметричный криптор, с помощью процедуры сеансового обмена ключами шифрует ключ и IV криптора по полученному открытому ключу, шифрует криптором пароль. Зашифрованные ключ, IV, и пароль одним массивом данных отсылаются удаленному серверу.
5. Удаленный сервер принимает зашифрованные данные, по закрытому ключу своего X509-сертификата расшифровывает переданные ключ и IV симметричного криптора, по расшифрованным ключу и IV расшифровывает пароль, вписывает пароль в базу.

В общем-то, вышеописанное - стандартная схема обмена Bob<->Alice, а у вас она вообще будет работать только в одну сторону. Чтобы нюансы лучше уложились в голове, можете почитать Applied Cryptography Шнайера (она есть и в переведенном виде, читается легко и увлекательно). Примерная техническая реализация вышеописанного приведена, например, здесь: http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2(v=vs.110).aspx#exampleToggle
24 сен 14, 09:44    [16614004]     Ответить | Цитировать Сообщить модератору
 Re: Передача зашифрованного пароля между серверами  [new]
aleks2
Guest
solitary
1. Шифровать с помощью какой-нибудь пользовательской функции, текст которой будет скрыт (WITH ENCRYPTED), хотя тут незадача: ее нужно создать на всех серверах, т.е. ее код можно будет увидеть все равно в процессе разливки.


Ну и зачем WITH ENCRYPTED?
Любой алгоритм шифрования публичен - т.е. может и должен быть реализован в открытом коде.
Секретом является только ключ.

И проблемой всех "систем шифрований" является не алгоритм, а вопрос: ХДЕ хранить и как передавать ключ?
Очень часто хранять прямо в замке.
24 сен 14, 10:10    [16614120]     Ответить | Цитировать Сообщить модератору
 Re: Передача зашифрованного пароля между серверами  [new]
solitary
Member

Откуда:
Сообщений: 16
Благодарю всех за ответы и информацию к размышлению!
25 сен 14, 22:26    [16623242]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить