Сопоставление значения с другим значением и обратно - PullRequest
0 голосов
/ 21 апреля 2009

Представьте значение, скажем, «1234». Я хочу отобразить это значение на другое значение, скажем, «abcd». Ограничения:

  1. Длина целевого значения равна начальному значению
  2. Отображение должно быть уникальным. Например. 1234 должен отображаться только в abcd и viseversa
  3. Процесс картирования должен быть (очень) сложным для угадывания. Например. умножение на 2 считается
  4. Отображение должно быть обратимым
  5. Начальным значением является целое число
  6. Целевое значение может быть любого типа

Это должен быть базовый алгоритм, в конце концов я напишу его на Ruby, но это не имеет значения.

Я думал так:

SECRET = 1234
def to(int)
  SECRET + int * 2
end

def fro(int)
  (int - SECRET)  / 2
end

Очевидно, что это нарушает ограничения 1 и 3.

Возможная цель - анонимизировать записи в моей базе данных. Я мог бы из-за этого подумать.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2009

Прежде всего, я скорее думаю, что ваши цели слишком амбициозны: почему ограничение 6?

Во-вторых, технически вам нужна биекция из области целых чисел.

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

В-четвертых, что вы анонимизируете против? Если вы имеете дело с личной информацией, как вы будете защищены от статистического анализа, который показывает, что Xyzzy на самом деле является Джоном Доу, основываясь на отношениях с другими данными? Есть некоторые исследования по противодействию таким векторам атаки (например, Google k-anonymization ').

В-пятых, используйте существующие криптографические примитивы, а не пытайтесь изобретать свои собственные. Существуют алгоритмы шифрования (например, AES в режиме cipher-block-chaining ), которые хорошо протестированы - AES хорошо поддерживается всеми современными платформами, предположительно Ruby. Тем не менее, шифрование все еще не дает анонимности записей в каком-либо сильном смысле.

1 голос
/ 21 апреля 2009

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

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

Рекомендации по работе с зашифрованными данными в MSSQL

шифрование базы данных

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

...