Как зашифровать строку и получить зашифрованную строку равной длины? - PullRequest
9 голосов
/ 12 июня 2009

Моя проблема заключается в следующем:

В существующей базе данных я хочу зашифровать данные в нескольких столбцах. Столбцы содержат строки различной длины.

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

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

Возможно ли это? Если так, как бы я это сделал?

Мне интересно делать это в .NET. Нет шифрования на уровне базы данных.

Ответы [ 8 ]

17 голосов
/ 19 июня 2009

В ваших константах я бы использовал AES в режиме CFB , который превращает его в потоковый шифр, и длина вывода будет равна длине ввода. Если вы не храните строки в BLOB-объектах, вам нужно будет закодировать вывод в шестнадцатеричном или Base64-формате, чтобы сделать его более дружественным к символам, что увеличит длину на 100% или 33%.

Одна реализация .NET здесь.

2 голосов
/ 23 сентября 2009

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

Однако, если вы действительно не можете расширить данные, которые вы шифруете, лучшее, что вы можете сделать, - это режим блочной настройки. Посмотрите режимы XTS и CMC, которые используются для шифрования диска.

2 голосов
/ 12 июня 2009

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

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

1 голос
/ 12 июня 2009

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

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

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

1 голос
/ 12 июня 2009

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

Неопределенные идеи для решения вашей проблемы:
- Сопоставьте свой номер с более короткой текстовой строкой: две цифры могут отображаться в один символ.
- Можете ли вы избежать шифрования первых x цифр?
- Каковы возможности для шифрования его как целое число, а не текст?

0 голосов
/ 12 июня 2009

В идеале, если существующие столбцы в стандартном блочном шифре больше одного блока (16 байтов для AES, 8 байтов для TDES), то вы можете зашифровать в режиме CTS (кража шифрованного текста), К сожалению, .net не поддерживает CTS ни в одном из включенных в него алгоритмов. : - (

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

0 голосов
/ 12 июня 2009

Подойдет любой блочный шифр. По сути, вы вводите блок фиксированной длины и получаете зашифрованный блок аналогичного размера. Шифр - это перестановка от {0, ..., 2 ^ длина блока} до {0, ..., 2 ^ длина блока}. (Длина ввода должна быть дополнена границей длины блока.)

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

AES является широко распространенным стандартом блочного шифра.

0 голосов
/ 12 июня 2009

Шифр ​​ Vigenère может сделать это. Но он старый (до компьютера) и безопасен только в том случае, если ваша ключевая фраза длиннее самой длинной строки, которую вы хотите зашифровать. Кроме того, наличие базы данных, полной строк, зашифрованных с помощью одной и той же ключевой фразы, вероятно, сделает это шифрованием за неделю, особенно если можно угадать простые тексты.

Он работает более или менее как алгоритм смещения Цезаря (добавьте n к каждой букве в виде обычного текста), за исключением того, что n отличается для каждой изменяемой буквы в зависимости от ключевой фразы.

Если ваша ключевая фраза ABCDEFG, то это означает, что n = 1 для первой буквы ввода, 2 для второй буквы ввода и т. Д.

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

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