2009-04-21 3 views
0

Представьте себе значение, например '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.

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

+1

Короткий вопрос: как вы обеспечите 1, если вы хотите обеспечить 6 одновременно? – Joey

+2

Это вас беспокоит, если кто-то еще взломал какой алгоритм? Простое хеширование (как вы полагаете) легко нарушает и компрометирует анонимность данных. В зависимости от ваших потребностей я бы предложил вам взглянуть на хеши в одном направлении. – dirkgently

+0

Да, это беспокоит меня, если кто-то взломает алгоритм. Совсем немного. И я знаю, что мое решение неприемлемо, вот почему я спросил. И я не думаю, что конфликт 1 и 6. Пункт 1 просто создает ограничение. Пункт 6 можно отбросить. С типом я имею в виду целое число, char и т. Д. – harm

ответ

4

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

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

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

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

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

+0

Хорошо, спасибо! Очевидно, я мало знаю об этом поле, вы дали достаточный материал на оставшуюся часть дня. Я ожидал, что ваша пятая точка будет поднята, но какая-то не лучше, чем ничего? Потенциально записи перемещаются по незашифрованной строке (не могут помочь), а «возможность» воровать должна быть как можно меньше. – harm

+0

+1 Теперь «это» впечатляет. –

+0

Некоторые могут быть лучше, чем ничего, но также и хуже, если, например, ROT13-уровень шифрования порождает ложное чувство безопасности ... Боитесь ли вы, что уловка с использованием стандартных алгоритмов шифрования будет слишком высокой? Я сомневаюсь в этом, но смотрю на это так: ваше решение не только защищено от других атак, но вы узнали что-то гораздо более полезное в следующий раз, когда вам нужно решить проблемы безопасности. Увы, решения для доморощенных, вероятно, потерпят неудачу по обоим этим причинам, увы! –

1

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

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

Best practices for dealing with encrypted data in MSSQL

database encryption

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

+0

База данных и код являются отдельными системами. Компрометация базы данных не обязательно означает взломанную базу кода. Я хочу, чтобы я мог хранить данные в небезопасной передаче клиенту без безвозвратной потери данных. Как только я знаю, что соединение безопасно (HTTP vs HTTPS), я хочу иметь возможность отправлять исходные данные. – harm

+0

ОК. Так возникает вопрос о шифровании данных через провод, а не о данных, которые содержатся в базе данных? –