Как зашифровать строку и получить зашифрованную строку равной длины?

URL-адрес запроса (GET и POST) может быть ограничен как браузером, так и сервером - обычно безопасный размер составляет 2 КБ, поскольку почти нет браузеров или серверов, которые используют меньший предел.

Тело запроса (POST) обычно * ограничено сервером на основе размера байта, чтобы предотвратить тип атаки DoS (обратите внимание, что это означает, что экранирование символов может увеличить размер байта тела). Наиболее распространенный параметр сервера - 10 МБ, хотя все популярные серверы позволяют увеличить или уменьшить его с помощью файла настроек или панели.

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

10
задан Theran 12 June 2009 в 18:44
поделиться

8 ответов

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

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

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

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

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

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

18
ответ дан 3 December 2019 в 16:54
поделиться

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

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

1
ответ дан 3 December 2019 в 16:54
поделиться

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

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

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

1
ответ дан 3 December 2019 в 16:54
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 16:54
поделиться

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

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

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

0
ответ дан 3 December 2019 в 16:54
поделиться

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

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

0
ответ дан 3 December 2019 в 16:54
поделиться

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

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

2
ответ дан 3 December 2019 в 16:54
поделиться

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

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

2
ответ дан 3 December 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: