Криптография в Java. Класс Signature
Привет, Хабр! Представляю вашему вниманию перевод пятой статьи «Java Signature» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.
Оглавление:
Java Signature (Подпись)
Класс Signature (java.security.Signature) создает цифровую подпись для двоичных данных. Цифровая подпись — это дайджест сообщения, зашифрованный закрытым ключом от пары закрытый / открытый ключ. Любой, кто владеет открытым ключом, может проверить цифровую подпись.
Создание экземпляра подписи
Прежде чем вы сможете использовать класс Signature, вы должны создать экземпляр этого класса, вызовом статического метода getInstance(). Ниже пример, в котором создается экземпляр Signature:
Signature signature = Signature.getInstance("SHA256WithDSA");
Строковый параметр, передаваемый методу getInstance(), определяет используемый алгоритма шифрования цифровой подписи.
Инициализация экземпляра подписи
После создания экземпляра Signature вам необходимо инициализировать его, перед тем как начать использовать его. Экземпляр Signature инициализируется вызывом его метода init(). Пример инициализации экземпляра подписи Java:
SecureRandom secureRandom = new SecureRandom(); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA"); KeyPair keyPair = keyPairGenerator.generateKeyPair(); signature.initSign(keyPair.getPrivate(), secureRandom);
Как видите, экземпляр Signature инициализируется закрытым ключом пары секретный / открытый ключ и экземпляром SecureRandom.
Создание цифровой подписи
Когда экземпляр Signature инициализирован, вы можете использовать его для создания цифровых подписей. Цифровая подпись создается вызывом метода update() (один или несколько раз) и заканчивая вызовом sign(). Пример создания цифровой подписи для двоичных данных:
byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8"); signature.update(data); byte[] digitalSignature = signature.sign();
Проверка цифровой подписи
Если вы хотите проверить цифровую подпись, созданную кем-то другим, вы должны инициализировать экземпляр подписи в режиме проверки (вместо режима подписи). Вот как выглядит инициализация экземпляра Signature в режиме проверки:
Signature signature = Signature.getInstance("SHA256WithDSA"); signature.initVerify(keyPair.getPublic());
Обратите внимание, что экземпляр Signature теперь инициализируется в режиме проверки, передавая открытый ключ от пары ключей в качестве параметра. После инициализации в режиме проверки вы можете использовать экземпляр Signature для проверки цифровой подписи:
byte[] data2 = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8"); signature2.update(data2); boolean verified = signature2.verify(digitalSignature);
Lesson: Signing Code and Granting It Permissions
This lesson shows how to use keytool , jarsigner , Policy Tool and jar to place files into JAR (Java ARchive) files for subsequent signing by the jarsigner tool.
This lesson has two parts. First, you will create and deploy an application. Second; you will act as the recipient of a signed application.
Here are the steps to create and deploy an application:
Note: For convenience, you pretend to be a user/developer named Susan Jones. You need to define Susan Jones when you generate the keys.
- Put Java class files comprising your application into a JAR file
- Sign the JAR file
- Export the public key certificate corresponding to the private key used to sign the JAR file
Here are the steps to grant permissions to an application
Note: For convenience, you pretend to be a user named Ray.
- You see how the signed application cannot normally read a file when it is run under a security manager.
- Use keytool to import a certificate into Ray’s keystore in an entry aliased by susan
- Use the Policy Tool to create an entry in Ray’s policy file to permit code signed by susan to read the specified file.
- Finally, you see how the application running under a security manager can now read the file, since it has been granted permission to do so.
For more information about digital signatures, certificates, keystores, and the tools, see the API and Tools Use for Secure Code and File Exchanges lesson.
Important: You need to perform the tasks in this lesson while working in the directory in which you store the sample application, but you should store the data file needed by the application in a different directory. All examples in this trail assume that you are working in the C:\Test directory, and that the data file is in the C:\TestData directory.
If you are working on a UNIX system, substitute your own directory names.
Lesson: Signing Code and Granting It Permissions
This lesson shows how to use keytool , jarsigner , Policy Tool and jar to place files into JAR (Java ARchive) files for subsequent signing by the jarsigner tool.
This lesson has two parts. First, you will create and deploy an application. Second; you will act as the recipient of a signed application.
Here are the steps to create and deploy an application:
Note: For convenience, you pretend to be a user/developer named Susan Jones. You need to define Susan Jones when you generate the keys.
- Put Java class files comprising your application into a JAR file
- Sign the JAR file
- Export the public key certificate corresponding to the private key used to sign the JAR file
Here are the steps to grant permissions to an application
Note: For convenience, you pretend to be a user named Ray.
- You see how the signed application cannot normally read a file when it is run under a security manager.
- Use keytool to import a certificate into Ray’s keystore in an entry aliased by susan
- Use the Policy Tool to create an entry in Ray’s policy file to permit code signed by susan to read the specified file.
- Finally, you see how the application running under a security manager can now read the file, since it has been granted permission to do so.
For more information about digital signatures, certificates, keystores, and the tools, see the API and Tools Use for Secure Code and File Exchanges lesson.
Important: You need to perform the tasks in this lesson while working in the directory in which you store the sample application, but you should store the data file needed by the application in a different directory. All examples in this trail assume that you are working in the C:\Test directory, and that the data file is in the C:\TestData directory.
If you are working on a UNIX system, substitute your own directory names.