Хэши и цифровые подписи (для приложений Магазина Windows)
Хэши
Криптографическая хэш-функция преобразовывает блок данных произвольной длины в двоичную строку фиксированной длины. Хэш-функции обычно используются при подписывании данных. В большинстве случаев операции подписывания с помощью открытого ключа требуют много вычислительных ресурсов. Вот почему целесообразно подписывать (шифровать) не само исходное сообщение, а его хэш. Рассмотрим типичный, хотя и упрощенный сценарий такой процедуры.
- Анна создает пару ключей. Закрытый ключ она держит в тайне, а открытый ключ публикует с помощью надежного центра сертификации.
- Анна создает сообщение, хэширует его, подписывает хэш с помощью своего закрытого ключа и посылает сообщение (в незашифрованном виде) и подпись Борису.
- Борис получает открытый ключ Анны, расшифровывает подпись и извлекает хэш Анны.
- Борис хэширует полученное от Анны сообщение и сравнивает вычисленный им хэш с тем, который был зашифрован. Если хэши совпадают, Борис может быть уверен, что сообщение Анны не было изменено.
Заметьте: Анна послала незашифрованное сообщение. Только хэш был зашифрован. Эта процедура позволяет убедиться только в том, что исходное сообщение не было изменено. А использование открытого ключа Анны показывает, что хэш сообщения был подписан кем-то, имеющим доступ к ее закрытому ключу, — предположительно, самой Анной.
Можно использовать класс HashAlgorithmProvider для перечисления доступных алгоритмов хэширования и создания значения CryptographicHash.
Цифровые подписи являются эквивалентом открытого ключа для кодов проверки подлинности сообщений (MAC) с закрытым ключом. Разница между ними в том, что MAC-коды используют закрытые ключи для того, чтобы получатель мог проверить, не было ли сообщение изменено при передаче, а в цифровых подписях для этого используются пары из открытого и закрытого ключа.
Цифровые подписи
Цифровые подписи являются эквивалентом открытого ключа для кодов проверки подлинности сообщений (MAC) с закрытым ключом. Разница между ними в том, что MAC-коды используют закрытые ключи для того, чтобы получатель мог проверить, не было ли сообщение изменено при передаче, а в цифровых подписях для этого используются пары из открытого и закрытого ключа.
Однако в большинстве случаев операции подписывания с помощью открытого ключа требуют много вычислительных ресурсов. Вот почему целесообразно подписывать (шифровать) не само исходное сообщение, а его хэш. Отправитель создает хэш сообщения, подписывает его и посылает подпись вместе с сообщением (в незашифрованном виде). Получатель вычисляет хэш-код сообщения, расшифровывает подпись и сравнивает полученный результат со значением хэша. Если они совпадают, получатель может быть уверен, что сообщение действительно было послано отправителем и не было изменено в процессе передачи.
Подписывание сообщений дает возможность убедиться только в том, что исходное сообщение не было изменено. А использование открытого ключа отправителя показывает, что хэш сообщения был подписан кем-то, имеющим доступ к закрытому ключу.
Для перечисления доступных алгоритмов подписи, а также для формирования или импорта пары ключей можно использовать объект AsymmetricKeyAlgorithmProvider. Для подписывания сообщения или проверки подписи можно использовать статические методы класса CryptographicHash.
Связанные разделы
Коды проверки подлинности сообщений, хэши и подписи
Схема создания приложений Магазина Windows на C# или Visual Basic