#r #encryption #mask #digest #anonymize
#r #шифрование #маска #дайджест #анонимизация
Вопрос:
Я пытаюсь создать блестящее приложение, которое позволяет пользователю выбирать столбцы для шифрования, где значения в каждой строке всегда должны быть одинаковыми при последующих запусках, если данные одинаковы. Т.е. Если имя клиента = «John», вы всегда получаете «A» при запуске этого процесса, еслиимя клиента меняется на «Jon», вы можете получить «C»… но если изменить обратно на «John», вы снова получите A. Это будет использоваться для «маскировки» конфиденциальных данных для анализа.
Кроме того, если кто-нибудь может указать способ «расшифровки» этих столбцов путем сохранения ключа для последующего использования… это было бы оценено.
Упрощенная версия того, как я пытаюсь это сделать (требуется библиотека дайджеста):
test <- data.frame(CustomerName=c("John Snow","John Snow","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Joe Farmer","Joe Farmer","Joe Farmer","Joe Farmer"),
LoanNumber=c("12548","45878","45796","45813","45125","45216","45125","45778","45126","32548","45683"),
LoanBalance=c("458463","5412548","458463","5412548","458463","5412548","458463","5412548","458463","5412548","2484722"),
FarmType=c("Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy"))
test[,1] <- sapply(test[,1],digest,algo="sha1")
Пример вывода:
CustomerName LoanNumber LoanBalance FarmType
1 5c96f777a14f201a6a9b79623d548f7ab61c7a11 12548 458463 Hay
2 5c96f777a14f201a6a9b79623d548f7ab61c7a11 45878 5412548 Dairy
3 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45796 458463 Fish
4 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45813 5412548 Hay
5 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45125 458463 Dairy
6 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45216 5412548 Fish
7 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45125 458463 Hay
8 b0db86a39b9617cef61a8986fd57af7960eec9f4 45778 5412548 Dairy
9 b0db86a39b9617cef61a8986fd57af7960eec9f4 45126 458463 Fish
10 b0db86a39b9617cef61a8986fd57af7960eec9f4 32548 5412548 Hay
11 b0db86a39b9617cef61a8986fd57af7960eec9f4 45683 2484722 Dairy
Измененный фрейм данных (удален ‘h’ в John):
test <- data.frame(CustomerName=c("Jon Snow","Jon Snow","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Joe Farmer","Joe Farmer","Joe Farmer","Joe Farmer"),
LoanNumber=c("12548","45878","45796","45813","45125","45216","45125","45778","45126","32548","45683"),
LoanBalance=c("458463","5412548","458463","5412548","458463","5412548","458463","5412548","458463","5412548","2484722"),
FarmType=c("Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy"))
test[,1] <- sapply(test[,1],digest,algo="sha1")
Новый вывод:
CustomerName LoanNumber LoanBalance FarmType
1 2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f 12548 458463 Hay
2 2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f 45878 5412548 Dairy
3 b0187b6ff2322fa86004d4d22cd479f3cdc345d2 45796 458463 Fish
4 b0187b6ff2322fa86004d4d22cd479f3cdc345d2 45813 5412548 Hay
5 b0187b6ff2322fa86004d4d22cd479f3cdc345d2 45125 458463 Dairy
6 b0187b6ff2322fa86004d4d22cd479f3cdc345d2 45216 5412548 Fish
7 b0187b6ff2322fa86004d4d22cd479f3cdc345d2 45125 458463 Hay
8 2127453066c45db6ba7e2f6f8c14d22796c3fd54 45778 5412548 Dairy
9 2127453066c45db6ba7e2f6f8c14d22796c3fd54 45126 458463 Fish
10 2127453066c45db6ba7e2f6f8c14d22796c3fd54 32548 5412548 Hay
11 2127453066c45db6ba7e2f6f8c14d22796c3fd54 45683 2484722 Dairy
Чего я ожидал:
CustomerName LoanNumber LoanBalance FarmType
1 2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f 12548 458463 Hay
2 2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f 45878 5412548 Dairy
3 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45796 458463 Fish
4 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45813 5412548 Hay
5 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45125 458463 Dairy
6 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45216 5412548 Fish
7 10bf345ab114c20df2d1eedbbe7e7cd6b969db05 45125 458463 Hay
8 b0db86a39b9617cef61a8986fd57af7960eec9f4 45778 5412548 Dairy
9 b0db86a39b9617cef61a8986fd57af7960eec9f4 45126 458463 Fish
10 b0db86a39b9617cef61a8986fd57af7960eec9f4 32548 5412548 Hay
11 b0db86a39b9617cef61a8986fd57af7960eec9f4 45683 2484722 Dairy
Я неправильно понимаю, как это работает? Если я применяю одну и ту же логику к нескольким столбцам, я получаю одинаковые значения для неизмененного столбца, но проблема сохраняется для столбца с измененными значениями. Я попытался векторизовать функцию digest, чтобы убедиться, что моя функция sapply не была проблемой с теми же результатами. Есть идеи?
Ответ №1:
Я думаю, что я ответил на свой собственный вопрос … конечно, сразу после публикации его здесь :).
Функция digest имеет параметр serialize со следующей документацией: Логическая переменная, указывающая, следует ли сериализовать объект с помощью serialize (в форме ASCII). Установка этого значения в FALSE позволяет сравнивать вывод дайджеста заданных символьных строк с известным выводом управления. Это также позволяет использовать необработанные векторы, такие как выходные данные сериализации, отличной от ASCII.
Установка serialize в FALSE, похоже, решает проблему, и я получаю ожидаемый результат.
пример:
test[,1] <- sapply(test[,1],digest,algo="sha1",serialize = FALSE)