Привет, Хабр! Представляю вашему вниманию перевод третьей статьи "Java MessageDigest" автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
- Cryptography
- Cipher
- MessageDigest
- Mac
- Signature
- KeyPair
- KeyGenerator
- KeyPairGenerator
- KeyStore
- Keytool
- Certificate
- CertificateFactory
- CertPath
Java MessageDigest (Дайджест сообщения)
Класс Java MessageDigest представляет криптографическую хеш-функцию, которая может вычислять дайджест сообщения из двоичных данных. Когда вы получаете набор зашифрованных данных, вы не можете быть уверены в том, что он не был изменен во время транспортировки. Дайджест сообщения помогает решить эту проблему.
Чтобы определить, были ли зашифрованные данные модифицированы при транспортировке, отправитель должен рассчитать дайджест сообщения из данных и отправить его вместе с данными. Другая сторона получая зашифрованные данные и дайджест сообщения, может пересчитать дайджест сообщения из данных и проверить, соответствует ли вычисленный дайджест сообщения дайджесту сообщения, полученному с данными. Если два дайджеста сообщения совпадают, существует вероятность того, что зашифрованные данные не были изменены во время транспортировки.
Есть несколько условий, которые должны быть выполнены, чтобы дайджест сообщения был полезен в качестве механизма обнаружения изменений. Однако точные условия являются частью криптографической теории которая не рассматривается в данной статье, а только объясняет, как использовать Java для получения дайджеста сообщения в классе MessageDigest.
Создание экземпляра MessageDigest
Для создания экземпляра класса MessageDigest, вызывается статический метод getInstance() класса MessageDigest. Вот пример создания экземпляра MessageDigest:
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
Строковый параметр, передаваемый методу getInstance(), определяет используемый алгоритм дайджеста конкретного сообщения.
Алгоритмы дайджеста сообщения
Java Cryptography API поддерживает следующие алгоритмы дайджеста сообщений (внешние поставщики криптографии могут поддерживать больше):
- MD2
- MD5
- SHA-1
- SHA-256
- SHA-384
- SHA-512
Не все эти алгоритмы одинаково безопасны. На момент написания статьи рекомендуется использовать SHA-256 или выше, чтобы получить максимально возможный уровень безопасности.
Вычисление дайджеста сообщения
Создав экземпляр MessageDigest, можно использовать его для расчета дайджеста сообщения. Если у вас есть один блок данных для расчета дайджеста сообщения, используйте метод digest(). Вот как выглядит вычисление дайджеста сообщения из одного блока данных:
byte[] data1 = "0123456789".getBytes("UTF-8");
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] digest = messageDigest.digest(data1);
Если есть несколько блоков данных для включения в один и тот же дайджест сообщения, вызовите метод update() и завершите вызовом digest(). Вот как выглядит вычисление дайджеста сообщения из нескольких блоков данных:
byte[] data1 = "0123456789".getBytes("UTF-8");
byte[] data2 = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(data1);
messageDigest.update(data2);
byte[] digest = messageDigest.digest();