Поделиться через


Хэши и цифровые подписи (для приложений Магазина Windows)

Хэши

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

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

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

Можно использовать класс HashAlgorithmProvider для перечисления доступных алгоритмов хэширования и создания значения CryptographicHash.

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

Цифровые подписи

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

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

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

Для перечисления доступных алгоритмов подписи, а также для формирования или импорта пары ключей можно использовать объект AsymmetricKeyAlgorithmProvider. Для подписывания сообщения или проверки подписи можно использовать статические методы класса CryptographicHash.

Связанные разделы

Коды проверки подлинности сообщений, хэши и подписи

Схема создания приложений Магазина Windows на C# или Visual Basic