Маскировка данных в SAS: скремблирование чувствительных наблюдений на уровне персонажа

Я работаю с данными клиента в SAS с конфиденциальной идентификационной информацией клиента. Задача состоит в том, чтобы замаскировать поле таким образом, чтобы оно оставалось числовым / буквенным / буквенно-цифровым. Я нашел способ использования побитовой функции в SAS (BXOR, BOR, BAND), но вывод полон специальных символов, которые SAS не может обрабатывать / сортировать / объединять и т. Д.

Я также думал о шифровании самого поля, основываясь на ключе, но не смог увидеть его до конца. Ниже приведены проблемы:

1) ДОЛЖЕН быть основан на ключе 2) ДОЛЖЕН быть обратимым. 3) Маскированное / скремблированное поле должно быть только числовым / буквенным / буквенно-цифровым, чтобы его можно было использовать в SAS. 4) Поле, которое должно быть замаскировано, имеет как алфавиты, так и числа, но имеет различную длину и миллионы наблюдений.

Любые советы о том, как добиться этой маскировки / скремблирования, будут очень оценены:(

2 ответа

Вот простое решение на основе ключей. Я представляю решение для шага данных здесь, а затем немного представлю версию FCMP. Я держу все в диапазоне от 48 до 127 (цифры, буквы и обычные символы, такие как @ > <и т. Д.); это не совсем буквенно-цифровой, но я не могу себе представить, почему это будет иметь значение в этом случае. Используя этот же метод, вы можете еще больше сократить его до буквенно-цифровых символов, но это сделает ключ намного хуже (всего 62 значения) и будет неудобно работать (поскольку у вас есть 3 несмежных диапазона).

data construct_key;
length keystr $1500;
do _t = 1 to 1500;
  _rannum = ceil(ranuni(7)*80);
  *if _rannum=12 then _rannum=-15;
  substr(keystr,_t,1)=byte(47+_rannum);

end;
call symput('keystr',keystr);
run;
%put %bquote(&keystr);



data encrypted;
set sashelp.class;
retain key "&keystr";
length name_encrypt $30;
do _t = 1 to length(name);
  substr(name_encrypt,_t,1) = byte(mod(rank(substr(name,_t,1)) + rank(substr(key,1,1))-94,80)+47);
  key = substr(key,2);
end;
keep name:;
run;

data unencrypted;
set encrypted;
retain key "&keystr";
length name_unenc $30;
do _t = 1 to length(name_encrypt);
  substr(name_unenc,_t,1) = byte(
      mod(80+rank(substr(name_encrypt,_t,1)) - rank(substr(key,1,1)),80)
+47);
  key = substr(key,2);
end;
run;

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

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

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

Вот версия FCMP:

%let keylength=5;
%let seed=15;

proc fcmp outlib=work.funcs.test;
subroutine encrypt(value $,key $);
  length key $&keylength.;
  outargs value,key;
  do _t = 1 to lengthc(value);
    substr(value,_t,1) = byte(mod(rank(substr(value,_t,1)) + rank(substr(key,1,1))-62,96)+31);
    key = substr(key,2)||substr(key,1,1);
  end;
endsub;

subroutine unencrypt(value $,key $);
  length key $&keylength.;
  outargs value,key;
  do _t = 1 to lengthc(value);
    substr(value,_t,1) = byte(mod(96+rank(substr(value,_t,1)) - rank(substr(key,1,1)),96)+31);
    key = substr(key,2)||substr(key,1,1);
  end;
endsub;

subroutine gen_key(seed,keystr $);
  outargs keystr;
  length keystr $&keylength.;
  do _t = 1 to &keylength.;
    _rannum = ceil(ranuni(seed)*80);    
    substr(keystr,_t,1)=byte(47+_rannum);
  end;
endsub;
quit;

options cmplib=work.funcs;



data encrypted;
set sashelp.class;
length key $&keylength.;
retain key ' '; *the missing is to avoid the uninitialized variable warning;
if _n_ = 1 then call gen_key(&seed,key);
call encrypt(name,key);
drop key;
run;

data unencrypted;
set encrypted;
length key $&keylength.;
retain key ' ';
if _n_ = 1 then call gen_key(&seed,key);
call unencrypt(name,key);
run;

Это несколько надежнее; он допускает символы от 32 до 127, а не от 48, что означает, что он успешно справляется с пробелом. (Tab по-прежнему не будет декодироваться должным образом - это будет k'.) Вы передаете начальное значение для вызова gen_key, а затем он использует этот ключ для оставшейся части процесса.

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

У SAS есть статья на их веб-сайте о том, как зашифровать определенные переменные. Надеюсь, это поможет вам.

ссылка на сайт

Другие вопросы по тегам