Цифровая подпись

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

Такая дополнительная система контроля стала возможной благодаря встроенному в пакет Java 1.1 механизму цифровых подписей. Для предоставления апплету дополнительных полномочий необходимо ответить на два впроса.

  1. Откуда поступил апплет?
  2. Был ли он во время пересылки изменен?

Специалисты в области математики и информатики разработали много сложных алгоритмов поддержки целостности данных и цифровых подписей. Многие из них реализованы в пакете java.security. Для использования таких алгоритмов совсем не обязательно понимать математические принципы, на которых они основаны. Механизм использования дайджеста сообщения (message digest) позволяет обнаружить факт изменения документа или сообщения. Применение цифровых подписей позволяет обеспечить подтверждение личности пользователя.

Дайджест сообщения

Дайджест сообщения - это цифровой "отпечаток" блока данных. Например, хэш-алгоритм обеспечения безопасности SHA1 (security hash algoritm #1) ставит в соответствие блоку данных произвольного размера 160 бит (20 байт). По аналогии с отпечатками пальцев, считается, что не существует двух одинаковых отпечатков SHA1. На самом деле, это не так, поскольку алгоритм SHA1 поддерживает 2160 отпечатков, поэтому теоретически они могут совпадать. Но вероятность дублирования очень мала. Согласно книге Джеймса Волша (James Walsh) True Odds: How risks Affect Your Everyday Life [Merritt Publishing, 1996] вероятность смерти от удара молнии составляет 1/30000. Если подсчитать вероятность такого же исхода для 10 человек (выбранных, например, злобным врагом), она окажется гораздо выше, чем вероятность наличия двух одинаковых отпечатков SHA1. (Конечно, от удара молнии погибло гораздо больше, чем 10 человек, но здесь речь идет о специально выбранной группе людей).

Дайджест сообщения имеет два важных свойства.

  1. Если изменить один или несколько битов данных, то дайджест сообщения тоже будет изменен.
  2. Нельзя изменить оригинальное сообщение таким образом, чтобы полученное поддельное сообщение имело такой же дайджест, что и у оригинального сообщения.
Существует несколько алгоритмов определения дайджеста сообщения. Наиболее известными из них являются SHA1, разработанный национальным институтом стандартов и технологий (National Institute of Standards and Technology - NIST), и MD5, изобретенный Рональдом Райвестом (Ronald Rivest) из Массачуссетского технологического института (Massachussets Institute of Technologies - MIT). Оба алгоритма зашифровывают сообщение разными оригинальными способами.

В языке Java реализованы оба эти алгоритма. Класс MessageDigest представляет собой фабрику (factory) объектов, которые формируют алгоритмы создания цифровых отпечатков. Данный класс содержит статический метод getInstance (), который возвращает экземпляр подкласса класса MessageDigest. Поэтому класс MessageDigest может выступать в роли класса-фабрики, или суперкласса, для всех алгоритмов создания профиля сообщения.

Далее приведен пример получения объекта для расчета отпечатка согласно алгоритму SHA1.

MessageDigest alg = MessageDigest.getInstance ("SHA-1");

Для получения объекта, который использует алгоритм MD5, необходимо в качестве аргумента метода getInstance вместо строки "SHA-1", указать строку "MD5".
После создания объекта MessageDigest ему необходимо передать все байты сообщения с помощью метода update (). Например, приведенный ниже фрагмент кода передает содержимое файла созданному выше объекту alg, формирующему цифровой отпечаток.

InputStream in = . . .
int ch;
while ((ch = in.read ()) != -1)
  alg.update ((byte) ch);

Если байты размещены в массиве, то метод update () можно применить для всего массива.

byte [] hash = alg.digest ();

Методы класса java.security.MessageDigest

Метод Описание
static MessageDigest getInstance (String alg) Возвращает объект MessageDigest, который реализует указанный алгоритм. Если заданный алгоритм не поддерживается, то генерируется исключение NoSuchAlgoritmException.
Параметр : alg Наименование алгоритма (SHA-1, MD5)
void update (byte input)
void update (byte [] input)
void update (byte [] input, int offset, int len)
Обновляет дайджест, учитывая указанные байты.
byte [] digest () Выполняет расчет согласно хэш-алгоритму, возвращает рассчитанный дайджест и возвращает объект, реализующий алгоритм, в исходное состояние.
void reset () Возвращает объект, реализующий алгоритм, в исходное состояние.