Мне нужно написать веб-приложение с использованием SQL Server 2005, asp.net и ado.net. Большая часть пользовательских данных, хранящихся в этом приложении, должна быть зашифрована (см. HIPAA).
В прошлом для проектов, которые требовали шифрования, я шифровал / расшифровывал в коде приложения. Тем не менее, это было обычно для шифрования паролей или информации о кредитной карте, так что только несколько столбцов в паре таблиц. Для этого приложения гораздо больше столбцов в нескольких таблицах необходимо зашифровать, поэтому я подозреваю, что передача ответственности за шифрование на уровень данных будет более эффективной, особенно с учетом встроенной поддержки SQL Server 2005 для нескольких типов шифрования. (Я мог бы быть убежден иначе, если у кого-то есть реальные, эмпирические доказательства.)
Я проконсультировался с BOL, и я довольно искусен в использовании Google. Поэтому мне не нужны ссылки на онлайн-статьи или документацию MSDN (вероятно, я уже читал их).
Один из подходов, который я обернул до сих пор, - это использование симметричного ключа, который открывается с помощью сертификата.
Итак, однократные этапы настройки (теоретически выполняются администратором базы данных):
- Создать мастер-ключ
- Резервное копирование Мастер Ключа в файл, запись на CD и сохранение вне сайта.
- Откройте мастер-ключ и создайте сертификат.
- Резервное копирование сертификата в файл, запись на компакт-диск и сохранение вне сайта.
- Создание симметричного ключа с выбранным алгоритмом шифрования с использованием сертификата.
Тогда каждый раз, когда хранимой процедуре (или пользователю-пользователю через Management Studio) требуется доступ к зашифрованным данным, вы должны сначала открыть симметричный ключ, выполнить любые операторы или пакеты tsql, а затем закрыть симметричный ключ.
Тогда, что касается приложения asp.net, а в моем случае уровня доступа к коду приложения, шифрование данных полностью прозрачно.
Итак, мои вопросы:
Хочу ли я открыть, выполнить операторы / пакеты tsql, а затем закрыть симметричный ключ внутри sproc? Опасность, которую я вижу, состоит в том, что если что-то пойдет не так с выполнением tsql, и выполнение кода sproc никогда не достигнет оператора, закрывающего ключ. Я предполагаю, что это означает, что ключ будет оставаться открытым до тех пор, пока sql не убьет SPID, на котором выполняется sproc.
Должен ли я вместо этого рассмотреть три вызова базы данных для любой конкретной процедуры, которую мне нужно выполнить (только когда необходимо шифрование)? Один вызов базы данных, чтобы открыть ключ, второй вызов, чтобы выполнить sproc, и третий вызов, чтобы закрыть ключ. (Каждый вызов обернут в свой собственный цикл try catch, чтобы максимизировать вероятность того, что открытый ключ в конечном итоге будет закрыт.)
Какие-либо соображения мне нужно для использования транзакций на стороне клиента (т.е. мой код является клиентом, и инициирует транзакцию, выполняет несколько sprocs, а затем фиксирует транзакцию в случае успеха)