Каков наилучший способ шифрования SSN в SQL Server 2008? - PullRequest
7 голосов
/ 16 февраля 2010

Я занимаюсь разработкой нового веб-приложения с использованием .NET 3.5 и SQL Server 2008, в котором необходимо будет хранить некоторые номера социального страхования. Я немного читал о шифровании базы данных, и это немного сбивает с толку.

Было бы неплохо зашифровать номера SSN с помощью асимметричного ключа, поскольку таким образом общедоступное приложение не сможет получить какие-либо данные после их шифрования. Я полагал, что только интерфейс администратора сможет расшифровать и отобразить данные. Но похоже, что SQL Server защищает данные только с помощью симметричного ключа?

Итак, каков наилучший способ шифрования SSN в SQL Server 2008? Бонусные баллы, если вы ссылаетесь на хороший учебник или два.

Ответы [ 3 ]

5 голосов
/ 16 февраля 2010

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

Асимметричное шифрование имеет тенденцию накладываться. Первое замечание заключается в том, что в таком шифровании должна быть какая-то случайная часть, потому что каждый может шифровать (открытый ключ, да, публичный): если процесс шифрования детерминирован, то любой может зашифровать все возможные SSN (их меньше, чем миллиарда из них (что очень мало для современного компьютера) и соответствуют зашифрованным значениям. Следовательно, во время шифрования должно быть добавлено несколько случайных чисел, а зашифрованный SSN больше, чем открытый SSN.

Известные системы асимметричного шифрования используют математические структуры, которые имеют свою стоимость. По сути, для системы шифрования RSA с «достаточно сильным» ключом зашифрованное сообщение будет иметь длину не менее 128 байтов. Некоторые системы шифрования работают лучше; придерживаясь проторенных путей академических исследований, я мог сделать это в 41 байт или около того (с Эль-Гамалем по эллиптической кривой NIST K-163). Меньше кажется сложнее.

Поэтому неудивительно, что данная система баз данных не будет включать такую ​​функцию по умолчанию.

Для вашей проблемы вы должны сначала определить (и написать) как можно более четко:

  • какие данные вы хотите защитить
  • кто вводит данные
  • кто должен читать данные обратно

и только тогда вы должны спросить себя, является ли шифрование подходящим инструментом для этого. Шифрование хорошо, когда предполагаемый злоумышленник может получить в свои руки необработанные, сохраненные данные. Это означает, что злоумышленник обошел защиту операционной системы. На этом этапе, что бы ни знала операционная система, злоумышленник также знает. Если база данных размещена на компьютере и существует интерфейс, через который можно получить расшифрованный SSN, то этот компьютер «знает», как получить данные, и злоумышленник - тоже самое. С другой стороны, если хост операционная система машины считается достаточно устойчивой, тогда, похоже, шифрование вообще не требуется.

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

1 голос
/ 18 февраля 2010

Вы действительно не хотите использовать асимметричное шифрование, потому что оно очень медленное. Скорее вы захотите защитить симметричный ключ с помощью асимметричного ключа, а затем сохранить симметричный ключ под рукой. Если честно, я бы придерживался того, что есть в SQL Server, а не проектировал вещи самостоятельно. Здесь действительно хорошее начало http://dotnetslackers.com/articles/sql/IntroductionToSQLServerEncryptionAndSymmetricKeyEncryptionTutorial.aspx

1 голос
/ 17 февраля 2010

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

Пример: (10+ Character Pass Phrase) -> SHA-1 => KEY.

Не пытайтесь полагаться на саму базу данных для выполнения шифрования (хотя, конечно, обратите внимание на такие функции, как TDE или любую хост-ОС, для которой вы используете поддержку полного дискового или файлового шифрования в качестве вторичного общего механизма безопасности), лучше используйте встроенные криптографические библиотеки .NET и любой язык программирования, который вы используете для чтения и записи в БД.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...