Как вы обеспечиваете безопасность данных малых данных?

Мой вопрос:

Каков наилучший подход к обеспечению безопасности малых данных? Ниже я представляю проблему симметричного и асимметричного шифрования. Мне любопытно, есть ли способ сделать асимметричное шифрование для небольших данных с эквивалентом какой-то «соли», чтобы действительно сделать его безопасным? Если да, то как выбрать «соль» и правильно ее реализовать? Или есть лучший способ справиться с этим?

Объяснение моего беспокойства:

При шифровании чего-то, что имеет «массу», мне кажется, что асимметричные подходы к шифрованию довольно безопасны. Меня беспокоит, если у меня есть небольшое поле данных, скажем, номер кредитной карты, пароль или номер социального страхования в базе данных. Тогда шифруемые данные имеют фиксированную длину и представление. При этом хакер может попытаться зашифровать все возможные номера социального страхования (10 ^ 9 перестановок) с помощью открытого ключа и сравнить его со значениями, хранящимися в базе данных. Как только они находят совпадение, они знают настоящее число. Аналогичные атаки могут быть выполнены и для других типов данных. Из-за этого я решил избегать симметричных методов, таких как встроенная функция mysql AES_ENCRYPT(), однако теперь я также сомневаюсь в асимметричности.

Как правильно защитить небольшие данные?

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

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

Как лучше всего обеспечить безопасность небольших данных?


person James Oravec    schedule 15.03.2016    source источник
comment
Вы, вероятно, захотите задать этот вопрос на Stackexchange по информационной безопасности.   -  person Mr. E    schedule 15.03.2016
comment
Почему асимметричное шифрование, вам нужны отдельные ключи шифрования и дешифрования?   -  person zaph    schedule 15.03.2016
comment
@Zaph, у тебя есть способ сделать дополнение симметричным? Если да, то это тоже сработает.   -  person James Oravec    schedule 16.03.2016
comment
Да, наиболее распространенным дополнением симметричного ключа является PKCS#7, урожденный PKCS#. 5 прокладка. Добавленное заполнение составляет 1 байт для размера блока в байтах (размер блока AES составляет 16 байтов) в дополнительной длине. Большинство реализаций библиотек поддерживают это, за исключением, конечно, PHP mcrypt.   -  person zaph    schedule 16.03.2016


Ответы (5)


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

Так, например, если я зашифрую поддельный номер кредитной карты 4242 4242 4242 4242. то, что я на самом деле шифрую

   tOH_AN2oi4MkLC3lmxxRWaNqh6--m42424242424242424

в первый раз, и

   iQe5xOZPIMjVWfrDDip244ZGhCy2U142424242424242424

второй раз и так далее.

Это случайное соление значительно препятствует подходу к таблице поиска, который вы описываете. Многие операционные системы предоставляют источники высококачественных случайных чисел, такие как *nix /dev/rand и модуль Windows RNGCryptoServiceProvider.

По-прежнему недопустимо хранить данные платежных карт таким образом без глубокоэшелонированной защиты и сертификации безопасности данных PCI.

Изменить. Некоторые схемы шифрования обрабатывают это соление как часть своей нормальной работы.

person O. Jones    schedule 15.03.2016
comment
Обычно используется случайный IV, который добавляется к зашифрованным данным. С помощью этой схемы я могу сказать, совпадают ли номера двух кредитных карт, поскольку номер CC находится в первом блоке. - person zaph; 15.03.2016

Если вы шифруете с помощью открытого ключа RSA, нет необходимости солить небольшие данные. Используйте заполнение OAEP. Заполнение вводит эквивалент случайной соли. Попробуйте: дважды зашифруйте номер кредитной карты одним и тем же открытым ключом RSA, используя дополнение OAEP, и посмотрите на результат. Вы увидите два разных значения, неотличимых от случайных данных.

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

РЕДАКТИРОВАТЬ: Это выходит за рамки вопроса, но, поскольку я упоминаю об этом в комментарии, если клиент может отправить вам произвольный зашифрованный текст для расшифровки («расшифровать информацию об этой кредитной карте»), вы не должны позволять клиенту видеть какую-либо разницу между ошибка заполнения при расшифровке по сравнению с любой другой ошибкой при расшифровке. Найдите "дополнительный оракул".

person Jim Flood    schedule 15.03.2016
comment
Даже заполнение PKCS # 1 v. 1.5 является случайным и будет создавать непредсказуемый зашифрованный текст, но для новых приложений следует выбирать OAEP. - person erickson; 15.03.2016
comment
Я рекомендую OAEP вместо PKCS #1 v. 1.5 из-за возможности дополнения оракула с последним. Но тогда у AES CBC также есть потенциал для дополнения оракула. - person Jim Flood; 16.03.2016
comment
@zaph, если бы это было так просто. См. blog.cryptographyengineering.com/2013/02/ - person Jim Flood; 16.03.2016
comment
Хорошо, никогда не используйте режимы CBC, ECB или CTR (одноразовое повторное использование). Также никогда не храните ключ шифрования на диске или в памяти. - person zaph; 16.03.2016

Если вам нужно зашифровать данные с помощью алгоритма симметричного ключа, хорошим выбором будет AES. Используйте такой режим, как CBC и случайный IV, это гарантирует, что шифрование одних и тех же данных будет давать разные результаты.

Добавьте PKCS#7, урожденный PKCS#5, для заполнения.

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

person zaph    schedule 15.03.2016

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

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

PCI-DSS требует, чтобы вы использовали надежную криптографию, которую они определяют следующим образом.

На момент публикации примеры проверенных и принятых стандартов и алгоритмов минимальной стойкости шифрования включают AES (128 бит и выше), TDES (минимальная тройная длина ключей), RSA (2048 бит и выше), ECC (160 бит и выше). выше) и ElGamal (2048 бит и выше). См. специальную публикацию NIST 800-57, часть 1 (http://csrc.nist.gov/publications/). ) для получения дополнительных рекомендаций по стойкости криптографических ключей и алгоритмов.

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

person Chris Hannon    schedule 15.03.2016

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

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

Если вы предпочитаете видеообъяснение темы, см. -Cut Shuffle: Small Domain Encryption Secure Against N Queries доклад из Crypto 2013. Он включает в себя графику, подробно описывающую работу нескольких алгоритмов, и некоторые ранние исследования безопасности таких проектов.

person Tim Shadel    schedule 14.08.2020