Итак, вы пришли сюда, чтобы прочитать заголовок статьи, значит, вы обеспокоены этой темой, но что, если вы не хотите, чтобы кто-то видел ваши списки чтения на носителе или по тем статьям, которым вы аплодировали?

Давайте сначала поймем «конфиденциальность». Что вы скажете, с точки зрения непрофессионала, это связано с простой изоляцией информации от всех остальных, кроме вас.
Но концепция выходит за рамки этого и не ограничивается следующим:

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

Примеры из реальной жизни

# 1

Прежде чем перейти к технической части терминов, давайте визуализируем предпосылку ситуации, для этого возьмем наш первый сценарий из реальной жизни -

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

Теперь после выборов проводится опрос для прогнозирования результатов выборов, который называется опросами общественного мнения, поэтому вы решили принять участие в одном из этих опросов, но у вас в голове возникают некоторые вопросы, которые относятся к одному или нескольким из -

  • Будет ли ваше мнение конфиденциальным?
  • Ваши голоса будут такими же, как и вы, или будет добавлена ​​некоторая случайность? и т.д..

# 2

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

Итак, предположим, что у вас есть таблица базы данных, как показано ниже -

Теперь здесь администратор базы данных ловко подавил один из отделов. информация под названием «продажи», но как вы думаете, можем ли мы анонимизировать данные таким образом, делая те же статистические результаты по базе данных? Мы скоро увидим ответ.

# 3

Давайте посмотрим на последний пример -

Допустим, есть больница, у которой есть база данных (или набор данных), в которой есть список пациентов с разными видами заболеваний в разных таблицах, поэтому давайте сосредоточимся на одной из таблиц, которые содержат данные о пациентах, больных раком, и просто анонимизированы. заменив исходную информацию на «1» для «да» и «0» для «нет».

original_db = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]

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

Чтобы понять это, давайте возьмем приведенный выше пример базы данных, содержащей информацию о онкологических больных, помеченных как «1» и «0».
Мы заинтересованы в том, чтобы обнаружить, что если мы запустим любой запрос (функция для получения информации из базу данных), а затем мы удаляем конкретный экземпляр из базы данных, а затем снова запускаем тот же запрос и проверяем, отличаются ли результаты.

Если результаты отличаются, то есть утечка данных этого конкретного экземпляра из базы данных.

Чувствительность

Итак, предположим, что у нас есть база данных, заполненная единицами и нулями, как в приведенном выше примере:

Пришло время писать код, будьте бдительны!

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

so , if we have original database of length say 'n' , then all the n possible parallel databases will have length 'n-1'.
Let's see that in code. 
[We will be using python and PyTorch framework]

Итак, по порядку.

The first function 'create' contains torch.rand() which creates a randomly filled tensor picked from uniform distribution.
Then, it compares every value to the '0.5' and then returns '0' for false and '1' for true.
Finally we have a randomly filled 1's and 0's tensor.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

The function 'get_parallel_db' contains torch.cat() which concatenates two tensors containing [:index] which says take all the elements from 0 to given index - 1 and then [index + 1:] which says take all the elements from index+1 till last which says that it will remove the element at 'index'.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

The final function 'get_parallel_dbs' simply creates parallel dbs for every index that is it makes all the possible parallel dbs with instances removed one by one differently in every other parallel dbs and return a pythonic lists of all the parallel dbs.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

'create_db_and_paralleldbs' combines all the above.
Let's say:
create_db_and_paralleldbs(10)
db.size = 10
length(pdbs) = 10
pdbs[0].size = 9

Итак, скажем:

db = tensor([1., 0., 0., 1., 1., 0., 1., 1., 1., 0.])
pdbs =   [tensor([0., 0., 1., 1., 0., 1., 1., 1., 0.]),  
tensor([1., 0., 1., 1., 0., 1., 1., 1., 0.]),  
tensor([1., 0., 1., 1., 0., 1., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 0., 1., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 0., 1., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 1., 1., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 1., 0., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 1., 0., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 1., 0., 1., 1., 0.]),  
tensor([1., 0., 0., 1., 1., 0., 1., 1., 1.])]

Теперь давайте запустим наши статистические запросы и проанализируем, есть ли какие-либо различия в наших результатах.

Now, What we do is first we define our query like sum or mean in a separate function.
Then, we create a function called 'L1_senstivity'.
What do we here needs some maths. So, let's see that first.

# математика -

L1 norm: norm - это функция, которая назначает строго положительную длину или размер каждому вектору в векторное пространство - за исключением нулевого вектора, которому присвоена нулевая длина.
Для вектора просто берется разность его компонентов.

Now, we run our query over original db and then run over every parallel database and take l₁ norm , then take all that difference and return the maximum of them.

Формально это определяется как чувствительность, которая считается максимальным изменением вывода запроса функции, когда мы удаляем один из экземпляров из базы данных (то есть все информация, относящаяся к одному конкретному человеку).

Математически,

for sum :   tensor(1)
for mean:   tensor(0.0005)

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

def query(db, threshold = 5):
  return (db.sum() > threshold).float()

здесь, если у нас есть база данных, сумма которой раньше была больше пяти для одной из параллельных баз данных, тогда как после удаления одного экземпляра ее сумма теперь становится меньше 5, и поэтому чувствительность здесь изменяется в зависимости от порядка элементов в самой базе данных.

Дифференциальная атака

Теперь мы поняли, что чувствительность может быть мерой того, сколько данных просачивается через запрос при обработке базы данных.
Итак, мы всегда предпочитаем, чтобы чувствительность была как можно более низкой.
Но теперь, мы пойдем дальше и посмотрим, почему простой анонимности данных или подавления информации недостаточно для обеспечения конфиденциальности данных и как мы можем атаковать базу данных, и поскольку здесь мы будем использовать наш запрос, это дифференциальная атака.

вспомните наши примеры выше, например, пример №2, в котором у нас была база данных о типе бизнеса и его бюджете, поэтому теперь предположим, что вы хотите знать, каков был бюджет продаж отдела, даже если этих данных нет в базе данных.
Что делать мы делаем сейчас?
хорошо, давайте сначала сделаем это -
скажем, у вас есть всего 10 яблок, а затем есть два человека, которые забрали ваши яблоки, не спросив, но один из них вернул все, что он взял (4) а другой - нет. Итак, как вы посчитаете, сколько заняло другое?
Просто, не так ли?
Вы просто вычитаете известные значения из общей суммы, чтобы получить неизвестное значение, аналогично тому, как мы сделали выше.

REQUIRED_SALES BUDGET = TOTAL - SUM(RECRUITMENT + HR + RECREATION + LOGISTICS)

Ура!
Мы вычислили скрытую информацию.
Точно так же, если у нас есть готовый запрос, и применим наш подход к запросу к примеру №3:

say you wanna , know the value of 10th row in the original database-
* sum(db) - sum(pdbs[10])
Above query will result in exact value of the 10th row and can reveal about the person if he has cancer or not.

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

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

Все основано на том, кто кому доверяет в любой системе или процессе.

Мы поговорим о добавлении шума в еще одном замечательном посте!
Следите за обновлениями!
А пока подумайте о том, как добавить шум в приведенных выше примерах баз данных.

— — — — — — — — — — — — — — — — — — — — — — — -

изображения: авторские права защищены их соответствующими владельцами.

Чтобы увидеть больше таких интересных историй, вы можете подписаться на меня или подписаться на меня.

Не стесняйтесь поделиться своим мнением о дифференцированной конфиденциальности в разделе комментариев ниже.

Хлопайте! Поделись! Следуй за мной!

— — — — — — — — — — — — — — — — — — — — — — — — — — — — —

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —