Обфускация данных в SQL Server


43

Какова лучшая практика для обфускации данных в SQL Server?

Мы хотели бы использовать маскированные производственные данные в нашей системе UAT.

Если мы хотим сделать это быстро и с более высоким уровнем запутанности, какой подход следует использовать? Я думаю о характере борьбы за имя и фамилию людей, но как? Должен ли я создать функцию самостоятельно или есть какие-либо предопределенные функции, доступные для использования? Я не хочу тратить время на переизобретение колеса :)

Как насчет полей даты? Например, следует ли случайным образом выбирать дату рождения из всей таблицы и назначать запись, или есть лучший способ сделать это?

Ответы:


25

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

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

Однако это не решает проблему, например, скажем, контактные данные. Вы можете выполнить требования закона, смешивая данные, но телефонные номера все еще действительны, электронные письма все еще действительны и т. Д. ... они просто не назначены правильному человеку. Для этого я рекомендую, чтобы при любой возможной очистке этих данных перед их передачей в UAT Red Gate создала программу под названием Data Generator, которая может создавать для вас случайные тестовые данные, чтобы вы могли заполнить поля данными, с которыми можно тестироваться.

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

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

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

Я надеюсь, что это поможет вам, и я желаю вам удачи в ваших поисках ... ;-)


1
Если бы я мог, я бы дал дополнительное возражение за упоминание политики компании.
Дезсо

Правовые требования определяются заинтересованными сторонами. Я должен реализовать это сейчас.
Небо

Мистер Баунстоун, ваше объяснение превосходно, как всегда. Спасибо. Я собираюсь проверить функцию CLR для этого и иметь представление о T-SQL. Посмотрите, какой из них подходит лучше и быстрее построить.
Небо

10

Мистер Браунстоун ударил гвоздь прямо в голову. Теперь, чтобы помочь вам немного, вот моя «искаженная» функция, используемая для запутывания строк (забавные результаты с именами!). Передав строку, она возвращает искаженную строку. Включите его в операторы обновления для строковых столбцов. Измените длину данных по своему усмотрению.

---------------------
-- Garble Function --
---------------------
-- Make a function to slightly garble the strings
IF (object_id('fn_Garble') is not null)
  drop function fn_Garble
go
create function fn_Garble
(
  @String varchar(255)
)  
returns varchar(255)
as
BEGIN
  select @String = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@String,'o','e'),'a','o'),'i','a'),'u','i'),'t','p'),'c','k'),'d','th'),'ee','e'),'oo','or'),'ll','ski')
  return @String
END
go

3
Звучит знакомо? (Просто иллюстрация вашей точки зрения.) SQL Server для eppowo konotho. В настоящее время Meprepelas также был на кеканге Waph SQL. Мы распространяем thopobose kensilponps pe voraeis piblak onth pravope sekper ergonazopaens. Все о SQL Server Mogozane на основе p-SQL 101 seraes orpakles / e-bek. Надеюсь, что SQL Server будет лучше, чем SQL 4.2.
Дезсо

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

Я ценю подход - простой, но работающий. И плюс в том, что текст все еще разборчивый. Я не мог этого понять, хотя :)
Дезсо

7

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

Когда я очищал свои пользовательские данные, я обменивал имена, на день рождения я помещал всех на 1 января года, в котором они фактически родились, и обновлял любые телефонные номера своим почтовым индексом (мои данные были только для США). Адреса электронной почты стали первыми плюс фамилия @ mycompany.co. Почтовый адрес доставил мне больше всего горя, но я сохранил город, штат и почтовый индекс, потому что я считаю, что они не будут проблемой, если адрес будет изменен. У меня был сотрудник, у которого была какая-то программа, которая генерировала искаженные буквы и обновила адресную строку этим.

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

В целом мои данные все еще были очень удобочитаемыми, хотя адрес не имел никакого смысла. Мне потребовалось несколько дней, чтобы все это заработало, но как только это было сделано и была создана работа агента sql, я мог очистить данные всего за 15 минут.


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

0

Для того, чтобы запутать одно поле, как насчет использования функции HASHBYTES (в SQL 2008+)? Вы можете выбрать свой алгоритм (вероятно, достаточно MD5), если вы засолите свои данные. Таким образом, вместо того, SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) чтобы просто убедиться, что вы делаете, SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')и теперь у вас есть хеш, который нельзя легко переборить.

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


Вы не должны использовать MD5 в этот день и возраст, это небезопасно.
Philᵀᴹ

Хорошо ... вот ваш выбор с HASHBYTES: MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 что-то для всех! (включая, да, те, которые вы не должны использовать). Скажем, мы используем SHA2_512 ... что-нибудь еще проблемное с этим подходом?
cmcapellan

-1

Взгляните на модуль PowerShell dbatools, чтобы узнать о бесплатной опции статического маскирования данных, написанной Крисси Лемэр (@ chrissy-lemaire) и ее командой. Все их инструменты великолепны, поэтому я уверен, что это стоит посмотреть.

Две команды для поиска в dbatools: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking

Посмотрите на сообщение в блоге, объявляющее об этом: автоматическое маскирование данных


2
Ответы только на ссылки не очень полезны. Вы можете улучшить свой ответ, приведя примеры использования командлетов и т. Д.
Эрик Дарлинг,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.