Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье представлен обзор методов шифрования и методик, поддерживаемых .NET, включая манифесты ClickOnce.
Общие сведения о криптографии
Общедоступные сети, такие как Интернет, не предоставляют средства безопасного взаимодействия между сущностями. Обмен данными по таким сетям подвержен чтению или даже изменению несанкционированными сторонними лицами. Криптография помогает защитить данные от просмотра, предоставляет способы определения того, были ли изменены данные, и помогает обеспечить безопасный способ обмена данными по небезопасным каналам. Например, данные можно шифровать с помощью криптографического алгоритма, передаваемого в зашифрованном состоянии, а затем расшифровывать предполагаемым участником. Если третья сторона перехватывает зашифрованные данные, расшифровать их будет трудно.
В .NET классы в System.Security.Cryptography пространстве имен обрабатывают множество деталей криптографии для вас. Некоторые из них являются оболочками для реализации операционной системы, а другие — чисто управляемыми реализациями. Вам не нужно быть экспертом в криптографии, чтобы использовать эти классы. При создании нового экземпляра одного из классов алгоритма шифрования ключи создаются автоматически для удобства использования, а характеристики по умолчанию являются максимально безопасными и надежными.
Криптографические примитивы
В типичной ситуации, когда используется криптография, две стороны (Алиса и Боб) взаимодействуют через небезопасный канал. Алиса и Боб хотят убедиться, что их общение остается непонятным для всех, кто может слушать. Кроме того, поскольку Алиса и Боб находятся в удаленных местах, Алиса должна убедиться, что информация, которую она получает от Боба, не была изменена кем-либо во время передачи. Кроме того, она должна убедиться, что информация действительно исходит от Боба, а не от кого-то, кто выдает себя за Боба.
Криптография используется для достижения следующих целей:
Конфиденциальность: чтобы защитить личность пользователя или данные от чтения.
Целостность данных. Чтобы защитить данные от изменения.
Проверка подлинности. Чтобы убедиться, что данные исходят из определенной стороны.
Неотказ от ответственности: предотвращение того, чтобы конкретная сторона отрицала, что она отправило сообщение.
Для достижения этих целей можно использовать сочетание алгоритмов и методик, известных как криптографические примитивы для создания криптографической схемы. В следующей таблице перечислены криптографические примитивы и их использование.
Криптографический примитив | Использование |
---|---|
Шифрование секретных ключей (симметричная криптография) | Выполняет преобразование данных, чтобы не читаться сторонними лицами. Этот тип шифрования использует один общий секретный ключ для шифрования и расшифровки данных. |
Шифрование открытого ключа (асимметричная криптография) | Выполняет преобразование данных, чтобы не читаться сторонними лицами. Этот тип шифрования использует пару открытого и закрытого ключа для шифрования и расшифровки данных. |
Криптографическая подпись | Помогает убедиться, что данные исходят из определенной стороны, создав цифровую подпись, уникальную для этой стороны. Этот процесс также использует хэш-функции. |
Хэши шифрования | Преобразует данные любой длины в последовательность байтов фиксированной длины. Хэши являются статистически уникальными; другая двухбайтовая последовательность не будет хэшироваться с тем же значением. |
шифрование Secret-Key
Алгоритмы шифрования секретных ключей используют один секретный ключ для шифрования и расшифровки данных. Необходимо защитить ключ от доступа к несанкционированным агентам, так как любая сторона, которая имеет ключ, может использовать его для расшифровки ваших данных или шифрования собственных данных, утверждая, что это исходит от вас.
Шифрование секретного ключа также называется симметричным шифрованием, так как тот же ключ используется для шифрования и расшифровки. Алгоритмы шифрования секретных ключей очень быстро (по сравнению с алгоритмами открытого ключа) и хорошо подходят для выполнения криптографических преобразований в больших потоках данных. Асимметричные алгоритмы шифрования, такие как RSA, ограничены математически в том, сколько данных они могут шифровать. Алгоритмы симметричного шифрования обычно не имеют таких проблем.
Тип алгоритма секретного ключа, называемого блочного шифра, используется для шифрования одного блока данных за раз. Блочные шифры, такие как шифрование данных (DES), TripleDES и advanced Encryption Standard (AES), преобразуют входной блок n байтов в выходной блок зашифрованных байтов. Если вы хотите зашифровать или расшифровать последовательность байтов, необходимо делать это блок за блоком. Так как n является небольшим (8 байт для DES и TripleDES; 16 байтов [по умолчанию], 24 байта или 32 байта для AES), значения данных, размер которых превышает n , необходимо зашифровать один блок за раз. Для обработки значений данных, которые меньше n, их необходимо увеличить до n.
Одна простая форма блочного шифра называется режимом электронной кодовой книги (ECB). Режим ECB не считается безопасным, так как он не использует вектор инициализации первого блока открытого текста. Для заданного ключа секрета k простой шифр блока, который не использует вектор инициализации, зашифрует тот же входной блок обычного текста в тот же выходной блок шифра. Поэтому при наличии повторяющихся блоков в входном потоке открытого текста в выходном потоке зашифрованного текста будут повторяться блоки. Эти повторяющиеся выходные блоки предупреждают несанкционированных пользователей о слабом шифровании, используемом алгоритмами, и возможных режимах атаки. Таким образом, режим шифра ECB довольно уязвим для анализа и, в конечном счете, обнаружения ключей.
Классы блочных шифров, предоставляемые в библиотеке базовых классов, используют режим цепочки по умолчанию, называемый цепочкой блоков шифров (CBC), хотя этот параметр можно изменить по умолчанию, если требуется.
Шифры CBC преодолевают проблемы, связанные с шифрами ECB, с помощью вектора инициализации (IV) для шифрования первого блока открытого текста. Каждый последующий блок обычного текста проходит побитовую монопольную операцию OR (XOR
) с предыдущим блоком шифра перед шифрованием. Таким образом, каждый блок шифра зависит от всех предыдущих блоков. При использовании этой системы общие заголовки сообщений, которые могут быть известны неавторизованным пользователям, нельзя использовать для обратного проектирования ключа.
Одним из способов компрометации данных, зашифрованных с помощью шифра CBC, является выполнение исчерпывающего поиска каждого возможного ключа. В зависимости от размера ключа, используемого для шифрования, такой поиск занимает очень много времени, даже на самых быстрых компьютерах, и поэтому является неосуществимым. Более крупные размеры ключей сложнее расшифровать. Хотя шифрование не делает теоретически невозможным для злоумышленника получить зашифрованные данные, он повышает стоимость этого. Если выполнение исчерпывающего поиска занимает три месяца для получения данных, которые имеют значение всего несколько дней, то такой метод поиска является нецелесообразным.
Недостатком шифрования секретного ключа является то, что предполагается, что две стороны согласились с ключом и IV и сообщили о своих ценностях. IV не считается секретом и может передаваться в виде обычного текста с сообщением. Однако ключ должен храниться в секрете от несанкционированных пользователей. Из-за этих проблем шифрование секретного ключа часто используется вместе с шифрованием открытого ключа для частного обмена значениями ключа и IV.
Предположим, что Алиса и Боб являются двумя сторонами, которые хотят взаимодействовать через небезопасный канал, они могут использовать шифрование секретного ключа следующим образом: Алиса и Боб согласны использовать один конкретный алгоритм (например, AES) с определенным ключом и IV. Алиса создает сообщение и создает сетевой поток (возможно, именованный канал или сетевую электронную почту), по которому отправляется сообщение. Затем она шифрует текст с помощью ключа и IV и отправляет зашифрованное сообщение и IV Бобу по интрасети. Боб получает зашифрованный текст и расшифровывает его с помощью IV и ранее согласованного ключа. Если передача перехватывается, перехватчик не может восстановить исходное сообщение, так как они не знают ключ. В этом сценарии ключ должен оставаться секретом. В реальном мире Алиса или Боб создает секретный ключ и использует шифрование открытого ключа (асимметричного) для передачи секрета (симметричного) ключа другой стороне. Дополнительные сведения о шифровании открытого ключа см. в следующем разделе.
.NET предоставляет следующие классы, реализующие алгоритмы шифрования секретного ключа:
HMACSHA256, HMACSHA384 и HMACSHA512. (Это технически секретные алгоритмы ключа, так как они представляют коды проверки подлинности сообщений, вычисляемые с помощью функции криптографического хэша в сочетании с секретным ключом. См . хэш-значения далее в этой статье.)
шифрование Public-Key
Шифрование с открытым ключом использует закрытый ключ, который должен храниться в секрете от несанкционированных пользователей и открытого ключа, который можно сделать общедоступным для всех. Открытый ключ и закрытый ключ связаны математически; данные, зашифрованные с помощью открытого ключа, можно расшифровать только с закрытым ключом, а данные, подписанные закрытым ключом, можно проверить только с помощью открытого ключа. Открытый ключ может быть доступен любому пользователю; он используется для шифрования данных, отправляемых в хранитель закрытого ключа. Алгоритмы шифрования с открытым ключом также называют асимметричными алгоритмами, так как для шифрования данных требуется один ключ, а для расшифровки данных требуется другой ключ. Базовое правило шифрования запрещает повторное использование ключей, и оба ключа должны быть уникальными для каждого сеанса связи. Однако на практике асимметричные ключи обычно являются долгоживущие.
Две стороны (Алиса и Боб) могут использовать шифрование открытого ключа следующим образом: Во-первых, Алиса создает пару открытого и закрытого ключа. Если Боб хочет отправить Алису зашифрованное сообщение, он просит ее за ее открытый ключ. Алиса отправляет Бобу свой открытый ключ через небезопасную сеть, и Боб использует этот ключ для шифрования сообщения. Боб отправляет зашифрованное сообщение Алисе, и она расшифровывает его с помощью закрытого ключа. Если Боб получил ключ Алисы по небезопасному каналу, например, через общедоступную сеть, Боб уязвим для атаки "человек посередине". Поэтому Боб должен проверить с Алисой, что у него есть правильная копия её открытого ключа.
Во время передачи открытого ключа Алисы несанкционированный агент может перехватить ключ. Кроме того, тот же агент может перехватывать зашифрованное сообщение от Боба. Однако агент не может расшифровать сообщение с открытым ключом. Сообщение можно расшифровать только с закрытым ключом Алисы, который не был передан. Алиса не использует свой закрытый ключ для шифрования ответного сообщения Бобу, так как любой пользователь с открытым ключом может расшифровать сообщение. Если Алиса хочет отправить сообщение обратно Бобу, она просит Боба за его открытый ключ и шифрует свое сообщение с помощью этого открытого ключа. Затем Боб расшифровывает сообщение с помощью связанного закрытого ключа.
В этом сценарии Алиса и Боб используют шифрование открытого ключа (асимметричного) для передачи ключа секрета (симметричного) и использования шифрования секретного ключа для остальной части сеанса.
В следующем списке представлены сравнения между алгоритмами шифрования с открытым ключом и секретным ключом:
Алгоритмы шифрования с открытым ключом используют фиксированный размер буфера, в то время как алгоритмы шифрования секретного ключа используют буфер переменной длины.
Алгоритмы открытого ключа нельзя использовать для объединения данных в потоки, так как алгоритмы секретного ключа могут быть зашифрованы только небольшими объемами данных. Поэтому асимметричные операции не используют ту же модель потоковой передачи, что и симметричные операции.
Шифрование с открытым ключом имеет гораздо большее пространство ключей (диапазон возможных значений для ключа), чем шифрование секретного ключа. Поэтому шифрование с открытым ключом менее подвержено исчерпывающим атакам, которые пытаются использовать каждый возможный ключ.
Открытые ключи легко распространять, так как они не должны быть защищены, при условии, что существует какой-то способ проверки удостоверения отправителя.
Некоторые алгоритмы открытого ключа (например, RSA и DSA, но не Diffie-Hellman) можно использовать для создания цифровых подписей для проверки удостоверения отправителя данных.
Алгоритмы открытого ключа очень медленны по сравнению с алгоритмами секретного ключа и не предназначены для шифрования больших объемов данных. Алгоритмы открытого ключа полезны только для передачи очень небольших объемов данных. Как правило, шифрование с открытым ключом используется для шифрования ключа и вектора инициализации (IV) для использования алгоритмом секретного ключа. После передачи ключа и вектора инициализации (IV) для оставшейся части сеанса используется шифрование с секретным ключом.
.NET предоставляет следующие классы, реализующие алгоритмы открытого ключа:
RSA разрешает шифрование и подписывание, но DSA можно использовать только для подписывания. DSA не так безопасна, как RSA, и мы рекомендуем RSA. Diffie-Hellman можно использовать только для создания ключей. Как правило, алгоритмы открытого ключа являются более ограниченными в их использовании, чем алгоритмы закрытого ключа.
Цифровые подписи
Алгоритмы открытого ключа также можно использовать для формирования цифровых подписей. Цифровые подписи проверяют подлинность удостоверения отправителя (если вы доверяете открытому ключу отправителя) и помогают защитить целостность данных. Используя открытый ключ, созданный Алиса, получатель данных Алисы может убедиться, что Алиса отправила его, сравнивая цифровые подписи с данными Алисы и открытым ключом Алисы.
Чтобы использовать криптографию открытого ключа для цифровой подписи сообщения, Алиса сначала применяет хэш-алгоритм к сообщению для создания дайджеста сообщений. Дайджест сообщения — это компактное и уникальное представление данных. Затем Алиса шифрует дайджест сообщения с ее закрытым ключом, чтобы создать свою личную подпись. После получения сообщения и подписи Боб расшифровывает подпись с помощью открытого ключа Алисы для восстановления дайджеста сообщения и хэширует сообщение с помощью того же хэш-алгоритма, который использовал Алиса. Если дайджест сообщения, который Боб вычисляет точно соответствует дайджесту сообщения, полученному от Алисы, Боб уверен, что сообщение поступило от обладателя закрытого ключа и что данные не были изменены. Если Боб доверяет, что Алиса является обладателем закрытого ключа, он знает, что сообщение пришло от Алисы.
Замечание
Подпись может быть проверена любым пользователем, так как открытый ключ отправителя является общим знанием и обычно включается в формат цифровой подписи. Этот метод не сохраняет секретность сообщения; чтобы сообщение было секретом, оно также должно быть зашифровано.
.NET предоставляет следующие классы, реализующие алгоритмы цифровой подписи:
Хэш-значения
Хэш-алгоритмы сопоставляют двоичные значения произвольной длины с меньшими двоичными значениями фиксированной длины, известной как хэш-значения. Хэш-значение — это числовое представление фрагмента данных. Если вы хэшируют абзац открытого текста и изменяете даже одну букву абзаца, последующий хэш создаст другое значение. Если хэш является криптографически сильным, его значение значительно изменится. Например, если один бит сообщения изменяется, то строгая хэш-функция может создать выходные данные, которые отличаются на 50 процентов. Многие входные значения могут хэшироваться в одни и те же выходные значения. Однако вычислительно невозможно найти два разных входных данных, хэшированных в одно и то же значение.
Две стороны (Алиса и Боб) могут использовать хэш-функцию для обеспечения целостности сообщений. Он выберет хэш-алгоритм для подписывания сообщений. Алиса напишет сообщение, а затем создаст хэш этого сообщения с помощью выбранного алгоритма. Затем они будут следовать одному из следующих методов:
Алиса отправляет сообщение с открытым текстом и хэшированное сообщение (цифровая подпись) Бобу. Боб получает и хэширует сообщение и сравнивает его хэш-значение с хэш-значением, которое он получил от Алисы. Если хэш-значения идентичны, сообщение не было изменено. Если значения не идентичны, сообщение было изменено после того, как Алиса написала его.
К сожалению, этот метод не устанавливает подлинность отправителя. Любой может олицетворить Алису и отправить сообщение Бобу. Они могут использовать один и тот же хэш-алгоритм для подписи сообщения, и все, что Боб может определить, это то, что сообщение соответствует своей подписи. Это одна из форм атаки посредника. Дополнительные сведения см. в примере безопасной связи для шифрования следующего поколения (CNG).
Алиса отправляет текстовое сообщение Бобу через небезопасный общедоступный канал. Она отправляет хэшированные сообщения Бобу через безопасный частный канал. Боб получает незашифрованное сообщение, хэширует его и сравнивает хэш с хэшом, который был передан приватно. Если хэши совпадают, Боб знает две вещи:
Сообщение не было изменено.
Отправитель сообщения (Алиса) подлинная.
Для работы этой системы Алиса должна скрыть свое исходное хэш-значение со всех сторон, кроме Боба.
Алиса отправляет текстовое сообщение Бобу через небезопасный общедоступный канал и помещает хэшированные сообщения на ее общедоступный веб-сайт.
Этот метод предотвращает изменение сообщения путем запрета любому пользователю изменять хэш-значение. Хотя сообщение и его хэш можно прочитать кем-либо, хэш-значение может быть изменено только Алиса. Злоумышленнику, который хочет олицетворить Алису, потребуется доступ к веб-сайту Алисы.
Ни один из предыдущих методов не позволит кому-то читать сообщения Алисы, так как они передаются в виде обычного текста. Для полной безопасности обычно требуются цифровые подписи (подпись сообщений) и шифрование.
.NET предоставляет следующие классы, реализующие алгоритмы хэширования:
.NET также предоставляет MD5 и SHA1. Но алгоритмы MD5 и SHA-1 были обнаружены небезопасными, и теперь рекомендуется SHA-2. SHA-2 включает SHA256, SHA384 и SHA512.
Случайное создание чисел
Случайное создание чисел является неотъемлемой частью многих криптографических операций. Например, криптографические ключи должны быть как можно более случайными, чтобы невозможно было воспроизвести их. Генераторы криптографических случайных чисел должны генерировать выходные данные, которые невозможно предсказать с вероятностью, превышающей одну вторую. Поэтому любой метод прогнозирования следующего выходного бита не должен выполняться лучше, чем случайное угадывание. Классы в .NET используют генераторы случайных чисел для создания криптографических ключей.
Класс RandomNumberGenerator представляет собой реализацию алгоритма генератора случайных чисел.
Манифесты ClickOnce
Следующие классы шифрования позволяют получать и проверять сведения о подписях манифестов для приложений, развернутых с помощью технологии ClickOnce:
Класс ManifestSignatureInformation получает сведения о сигнатуре манифеста, когда используются перегрузки его метода VerifySignature.
Перечисление ManifestKinds можно использовать для указания, какие манифесты проверять. Результат проверки является одним из SignatureVerificationResult значений перечисления.
Класс ManifestSignatureInformationCollection предоставляет коллекцию, доступную только для чтения, с объектами ManifestSignatureInformation проверенных подписей.
Кроме того, следующие классы предоставляют определенные сведения о подписях:
StrongNameSignatureInformation содержит сведения о сигнатуре строгого имени для файла манифеста.
AuthenticodeSignatureInformation представляет сведения о подписи Authenticode для манифеста.
TimestampInformation содержит информацию о метке времени на подписи Authenticode.
TrustStatus предоставляет простой способ проверить, является ли подпись Authenticode доверенной.
Классы следующего поколения шифрования (CNG)
Классы шифрования следующего поколения (CNG) предоставляют управляемую оболочку для собственных функций CNG. (CNG является заменой cryptoAPI.) Эти классы имеют "Cng" в составе их имен. Центральным для классов оболочки CNG является CngKey класс контейнера ключей, который абстрагирует хранение и использование ключей CNG. Этот класс позволяет безопасно хранить пару ключей или открытый ключ и ссылаться на него с помощью простого имени строки. Класс подписи на базе ECDsaCng эллиптической кривой и класс шифрования ECDiffieHellmanCng могут использовать объекты CngKey.
Класс CngKey используется для различных дополнительных операций, включая открытие, создание, удаление и экспорт ключей. Он также предоставляет доступ к базовому дескриптору ключа для использования при вызове нативных функций непосредственно.
.NET также включает различные вспомогательные классы CNG, например следующие:
CngProvider поддерживает поставщика хранилища ключей.
CngAlgorithm поддерживает алгоритм CNG.
CngProperty поддерживает часто используемые свойства ключей.
См. также
- Модель шифрования — описывает, как криптография реализована в библиотеке базовых классов.
- Кроссплатформенная криптография
- Временные уязвимости при симметричном расшифровании в режиме CBC с использованием выравнивания
- защита основных данных ASP.NET