- Краткое введение в класс messagedigest:
- Введение
- Основные классы и интерфейсы
- Обзор
- API JSSE
- 1. SSLSocketFactory
- 2. SSLSocket
- 3. SSLServerSocket Factory
- 4. SSLServerSocket
- Пример SSL
- Cipher (шифр)
- Keymanager
- Keys (ключи)
- Provider (поставщик криптографии)
- Безопасность ключа
- Веб-приложение на java
- Генерация ключа
- Генерация пары ключей
- Дайджест сообщения (messagedigest)
- Зачем вообще нужен сертификат?
- Инициализация шифра
- Код аутентификации сообщения (mac)
- Много об oracle certified professional: java 11 programmer i (1z0-815)
- Немного из истории сертификации
- Немного о литературе для подготовки
- О процедуре заказа и прохождения экзамена
- Особенности подготовки к сертификационным экзаменам по java se
- Подготовка к сертификации oracle java programmer (ocajp) | otus
- Подпись (signature)
- Подпись данных
- Полный пример подписи и проверки
- Проверка подписи
- Расширение криптографии java
- Хранилище ключей (key store)
- Шифрование или дешифрование данных
- Щепотка вдохновения
- Заключение
Краткое введение в класс messagedigest:
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");В этом примере создается экземпляр MessageDigest, который использует внутренний алгоритм криптографического хэширования SHA-256 для вычисления дайджестов сообщений.
Чтобы вычислить дайджест сообщения некоторых данных, вы вызываете метод update() или digest(). Метод update() может вызываться несколько раз, а дайджест сообщения обновляется внутри объекта. Когда вы передали все данные, которые вы хотите включить в дайджест сообщения, вы вызываете digest() и извлекаете итоговые данные дайджеста сообщения.
Пример вызова update() несколько раз с последующим вызовом digest():
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] data1 = "0123456789".getBytes("UTF-8");
byte[] data2 = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
messageDigest.update(data1);
messageDigest.update(data2);
byte[] digest = messageDigest.digest();Вы также можете вызвать digest() один раз, передав все данные, чтобы вычислить дайджест сообщения. Пример:
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] data1 = "0123456789".getBytes("UTF-8");
byte[] digest = messageDigest.digest(data1);Введение
Проще говоря, уровень защищенных сокетов (SSL) обеспечивает защищенное соединение между двумя сторонами, обычно клиентами и серверами.
SSL обеспечивает безопасный канал между двумя устройствами, работающими по сетевому соединению. Одним из обычных примеров SSL является обеспечение безопасной связи между веб-браузерами и веб-серверами.
Основные классы и интерфейсы
API криптографии Java состоит из следующих пакетов Java:
Основные классы и интерфейсы этих пакетов:
Обзор
В этом уроке мы представим SSL и рассмотрим, как мы можем использовать его в Java с помощью API JSSE (Java Secure Socket Extension).
API JSSE
API безопасности Java широко используют шаблон Factory design.
На самом деле все создается с помощью фабрики в JSSE.
1. SSLSocketFactory
javax.net.ssl.SSLSocketFactory используется для создания объектов SSLSocket .
Этот класс содержит три группы API.
Первая группа состоит из одного статического метода getDefault () , используемого для извлечения экземпляра по умолчанию, который, в свою очередь, может создавать экземпляры SSLSocket .
Вторая группа состоит из пяти методов, которые можно использовать для создания экземпляров SSLSocket :
- Сокет createSocket(String host, int-порт)
- Сокет createSocket(String host, int port, InetAddress clientHost, int clientPort)
- Сокет createSocket(хост InetAddress, порт int)
- Сокет createSocket(InetAddress host, int port, InetAddress clientHost, int clientPort)
- Socket createSocket(сокет, строковый хост, порт int, логическая автоклюзия)
Мы можем использовать этот класс напрямую, получив экземпляр по умолчанию или используя объект javax.net.ssl. SSLContext, который содержит методы для получения экземпляра SSLSocketFactory .
2. SSLSocket
Этот класс расширяет класс Socket и обеспечивает безопасный сокет. Такие сокеты являются обычными потоковыми сокетами.
Кроме того, они добавляют уровень защиты по базовому сетевому транспортному протоколу.
Экземпляры SSLSocket создают SSL-соединение с именованным хостом на указанном порту.
Это позволяет привязать клиентскую сторону соединения к заданному адресу и порту.
3. SSLServerSocket Factory
Класс SSLServerSocketFactory очень похож на SSLSocketFactory с той разницей, что он создает экземпляры SSLServerSocket вместо экземпляров SSLSocket .
По сходству методы называются createServerSocket аналогично классу SSLSocketFactory .
4. SSLServerSocket
Класс SSLServerSocket аналогичен классу SSLSocket . Методы класса SSLServerSocket являются подмножеством методов класса SSLSocket . Они действуют на противоположной стороне SSL-соединения
Пример SSL
Давайте приведем пример того, как мы можем создать защищенное соединение с сервером:
В случае, если мы получим ошибку “javax.net.ssl.SSLHandshakeException: sun.security.validator.Исключение ValidatorException: ошибка построения пути PKIX: sun.security.provider.certpath.Исключение SunCertPathBuilderException: не удается найти допустимый путь сертификации к запрошенному целевому объекту при установлении SSL-соединения” , это указывает на то, что у нас нет открытого сертификата сервера, который мы пытаемся подключить в хранилище доверия Java.
Хранилище доверия-это файл, содержащий доверенные сертификаты, которые Java использует для проверки защищенных соединений.
Чтобы решить эту проблему, у нас есть несколько вариантов:
- добавьте открытый сертификат сервера в файл по умолчанию cacertstruststore , используемый Java. при инициировании SSL-соединения
- Установите javax.net.ssl.trustStore переменная среды, указывающая на файл truststore, чтобы приложение могло получить этот файл, содержащий открытый сертификат сервера, к которому мы подключаемся.
Шаги по установке нового сертификата в хранилище доверия Java по умолчанию следующие:
Cipher (шифр)
Класс Cipher (javax.crypto.Cipher) представляет криптографический алгоритм. Шифр может использоваться как для шифрования, так и для расшифровки данных. Класс Cipher объясняется более подробно в следующих разделах, ниже будет его краткое описание.
Создание экземпляра класса шифр, который использует алгоритм шифрования AES для внутреннего использования:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");Метод Cipher.getInstance(…) принимает строку, определяющую, какой алгоритм шифрования использовать, а также некоторые другие параметры алгоритма.В приведенном выше примере:
Keymanager
— это менеджер ключей.
Он отвечает за то, какой “authentication credential” предоставить тому, кто к нам обратиться. Credential можно перевести, как удостоверение. Удостоверение нужно, чтобы клиент был уверен что сервер тот, за кого себя выдаёт и ему можно доверять.
Кроме того, в ”
” сказано, что SSL использует “asymmetric cryptography”, а это значит, что нам требуется пара ключей: public key и private key.
Так как речь зашла о криптографии, то в дело вступает “Java Cryptography Architecture” (JCA). Oracle по данной архитектуре предоставляет отличный документ: “
“.
Кроме этого, можно прочитать кратки обзор JCA на JavaRush: ”
“.
Итак, для инициализации KeyManager нам нужен KeyStore, в котором будет храниться сертификат нашего сервера. Самым распространённым способом создания хранилища ключей и сертификатов является утилита keytool, которая входит в состав JDK. Пример можно увидеть в документации JSSE: “
“.
Итак, нам нужно при помощи утилиты KeyTool создать хранилище ключей и записать туда сертификат. Интересно, что раньше генерация ключа задавалось при помощи -genkey, а теперь рекомендуется использовать -genkeypair.
Нам понадобится определить следующие вещи:
Keys (ключи)
Для шифрования или дешифрования данных вам нужен ключ. Существует два типа ключей в зависимости от того, какой тип алгоритма шифрования используется:
Симметричные ключи используются для симметричных алгоритмов шифрования. Алгоритмы симметричного шифрования используют один и тот же ключ для шифрования и расшифровки.Асимметричные ключи используются для алгоритмов асимметричного шифрования. Алгоритмы асимметричного шифрования используют один ключ для шифрования, а другой для дешифрования. Алгоритмы шифрования с открытым и закрытым ключом — примеры асимметричных алгоритмов шифрования.
Каким-то образом сторона, которая должна расшифровать данные, должна знать ключ, необходимый для дешифрования данных. Если дешифрующая сторона не является стороной шифрующей данные, эти две стороны должны договориться о ключе или обменяться ключом. Это называется обменом ключами.
Provider (поставщик криптографии)
Класс Provider (java.security.Provider) является центральным классом в Java crypto API. Для того чтобы использовать Java crypto API, вам нужно установить поставщика криптографии. Java SDK поставляется с собственным поставщиком криптографии. Если вы явно не установите поставщик криптографии, то будет использоваться поставщик по умолчанию.
Один из самых популярных поставщиков криптографии для Java crypto API называется Bouncy Castle. Вот пример, где в качестве поставщика криптографии устанавливается BouncyCastleProvider:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
public class ProviderExample {
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
}
}Безопасность ключа
Ключи должны быть трудно угадываемые, чтобы злоумышленник не мог легко подобрать ключ шифрования. В примере из предыдущего раздела о классе Шифр(Cipher) использовался очень простой, жестко закодированный ключ. На практике так делать не стоит. Если ключ сторон легко угадать, злоумышленнику будет легко расшифровать зашифрованные данные и, возможно, создать поддельные сообщения самостоятельно.
Веб-приложение на java
Итак, нам нужно создать самое простое веб-приложение на Java. Для начала, нам нужно само приложение на Java. Для этого воспользуемся системой автоматической сборки проекта Gradle. Это нам позволит не создавать вручную нужную структуру каталогов Gradle за нас будет управлять всеми необходимыми для проекта библиотеками и обеспечивать, чтобы они были доступны при выполнении кода. Подробнее про Gradle можно прочитать в небольшом обзоре: “
“.
Воспользуемся
‘ом и выполним команду:
gradle init --type java-application
После этого откроем билд скрипт
build.gradle
, в котором описано, из каких библиотек состоит наш проект, которые Gradle нам предоставит.
Добавим туда зависимость от веб-сервера, на котором мы будем экспериментировать:
dependencies {
// Web server
implementation 'io.undertow:undertow-core:2.0.20.Final'
// Use JUnit test framework
testImplementation 'junit:junit:4.12'
}
Чтобы веб-приложение работало, нам обязательно нужен веб-сервер, где будет размещено наше приложение. Веб серверов существует огромное множество, но основные это: Tomcat, Jetty, Undertow. Мы с Вами выберем на этот раз Undertow.
Чтобы понять, как нам работать с этим нашим веб-сервером перейдём на официальный сайт
и перейдём в раздел
.
Мы с Вами подключили зависимость от Undertow Core, поэтому нам интересует раздел про этот самый
, то есть ядро, основу веб-сервера.
Самым простым способом является использование Builder API для Undertow:
Генерация ключа
Чтобы сгенерировать случайные ключи шифрования вы можете использовать класс Java KeyGenerator. KeyGenerator будет более подробно описан в следующих главах, вот небольшой пример его использования здесь:
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
int keyBitSize = 256;
keyGenerator.init(keyBitSize, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();Полученный экземпляр SecretKey можно передать в метод Cipher.init(), например так:
cipher.init(Cipher.ENCRYPT_MODE, secretKey);Генерация пары ключей
Алгоритмы асимметричного шифрования используют пару ключей, состоящую из открытого ключа и закрытого ключа, для шифрования и дешифрования данных. Для создания асимметричной пары ключей вы можете использовать KeyPairGenerator (java.security.KeyPairGenerator). KeyPairGenerator будет более подробно описан в следующих главах, ниже простой пример использования Java KeyPairGenerator:
SecureRandom secureRandom = new SecureRandom();
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
KeyPair keyPair = keyPairGenerator.generateKeyPair();Дайджест сообщения (messagedigest)
Когда вы получаете зашифрованные данные от другой стороны, можете ли вы быть уверенными что никто не изменил зашифрованные данные по пути к вам?
Обычно решение состоит в том, чтобы вычислить дайджест сообщения из данных до его шифрования, а затем зашифровать как данные, так и дайджест сообщения, и отправить его по сети. Дайджест сообщения — это хеш-значение, рассчитанное на основе данных сообщения. Если в зашифрованных данных изменяется хоть один байт, изменится и дайджест сообщения, рассчитанный по данным.
При получении зашифрованных данных вы расшифровываете их, вычисляете из них дайджест сообщения и сравниваете вычисленный дайджест сообщения с дайджестом сообщения, отправленного вместе с зашифрованными данными. Если два дайджеста сообщения одинаковы, существует высокая вероятность (но не 100%) того, что данные не были изменены.
Java MessageDigest (java.security.MessageDigest) можно использовать для вычисления дайджестов сообщений. Для создания экземпляра MessageDigest вызывается метод MessageDigest.getInstance(). Существует несколько различных алгоритмов дайджеста сообщений.
Зачем вообще нужен сертификат?
Вопрос холиварный, как и вопрос, нужно ли программисту специальное высшее образование. С одной стороны, сертификат не дает никаких преимуществ. С другой стороны, его наличие может зацепить глаз HR, особенно в ситуации с разработчиками, которые пришли из другого языка или переквалифицируются из тестировщиков. Кроме того, наличие сертификата покажет, что вы умеете ставить цели и достигать их.
Моими стимулами были:
- желание расширить и консолидировать свои знания и понимание Java, включая те части API, которые редко используются в текущих задачах;
- изучить новшества долгожданных Java 9…11, чтобы быть готовым к будущему, которое обязательно наступит (смахнул скупую мужскую слезу, ковыряя проект на EJB3.0).
Можно, конечно, добиться этих целей и без сертификации, но тем, кто знаком со SMART и с принципом кнута (потеря денег за попытку сертификации) и пряника (документ и значок в коллекцию), нетрудно понять, что так обучение проходит гораздо эффективнее.
Получать сертификат или нет — личное дело каждого. В этой статье я лишь постарался дать свои рекомендации по подготовке к экзамену.
Инициализация шифра
Перед использованием экземпляра шифра его необходимо инициализировать. Экземпляр шифра инициализируется вызывом метода init(). Метод init() принимает два параметра:
Первый параметр указывает, режим работы экземпляра шифр: шифровать или расшифровывать данные. Второй параметр указывает, какой ключ они используют для шифрования или расшифровки данных.
Пример:
byte[] keyBytes = new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
String algorithm = "RawBytes";
SecretKeySpec key = new SecretKeySpec(keyBytes, algorithm);
cipher.init(Cipher.ENCRYPT_MODE, key);
Обратите внимание, что способ создания ключа в этом примере небезопасен и не должен использоваться на практике. В этой статье в следующих разделах будет рассказано, как создавать ключи более безопасно.
Чтобы инициализировать экземпляр шифра для расшифровки данных, вы должны использовать Cipher.DECRYPT_MODE, например:
cipher.init(Cipher.DECRYPT_MODE, key);Код аутентификации сообщения (mac)
Класс Java Mac используется для создания MAC(Message Authentication Code) из сообщения. MAC похож на дайджест сообщения, но использует дополнительный ключ для шифрования дайджеста сообщения. Только имея как исходные данные, так и ключ, вы можете проверить MAC.
Экземпляр Java Mac создается вызовом метода Mac.getInstance(), передавая в качестве параметра имя используемого алгоритма. Вот как это выглядит:
Mac mac = Mac.getInstance("HmacSHA256");Прежде чем создать MAC из данных, вы должны инициализировать экземпляр Mac ключом. Вот пример инициализации экземпляра Mac ключом:
byte[] keyBytes = new byte[]{0,1,2,3,4,5,6,7,8 ,9,10,11,12,13,14,15};
String algorithm = "RawBytes";
SecretKeySpec key = new SecretKeySpec(keyBytes, algorithm);
mac.init(key);После инициализации экземпляра Mac вы можете вычислить MAC из данных, вызвав методы update() и doFinal(). Если у вас есть все данные для расчета MAC, вы можете сразу вызвать метод doFinal(). Вот как это выглядит:
byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
byte[] data2 = "0123456789".getBytes("UTF-8");
mac.update(data);
mac.update(data2);
byte[] macBytes = mac.doFinal();Много об oracle certified professional: java 11 programmer i (1z0-815)
В этой статье речь пойдет о первом из необходимых экзаменов, Oracle Certified Professional: Java 11 Programmer I (1Z0-815). Подготовка заняла у меня около двух месяцев (по два-три часа в день). На тот момент в интернете было не так много информации о самом экзамене, а обучающей литературы нет и поныне. Поэтому я надеюсь, что мои мысли прольют свет на его самые важные особенности и помогут читателям с легкостью сдать его.
Экзамен сдается на английском, так что ваш уровень языка должен быть достаточным для понимания технической литературы (к слову, вся подготовительная литература написана на нем).
По сути, сам экзамен проверяет знание основ Java без глубокого погружения в отдельные API (IO, NIO 2.0, Concurrency, Stream и т. д.). В основном вам придется работать либо компилятором (указать, скомпилируется ли код), либо JRE (указать на результат выполнения кода или на то, какой Exception будет выброшен).
Но при этом даже опытным программистам не стоит расслабляться и игнорировать подготовку, потому что составители тестов будут пытаться поймать вас на банальной невнимательности, а это не так уж и трудно, учитывая, что в написании компилируемого кода нам помогает IDE.
Пример. Какой тип данных (x y)?
double x = 39.21; float y = 2.1;
Правильный ответ: строчка float y = 2.1 не компилируется, так как нет символа f после 2.1.
Или же вас попросят рассказать о результате выполнения кода, присланного одним из ваших восточных коллег:
public class Test {
public void print(Integer x) {
System.out.print("Integer");
}
public void print(float x) {
System.out.print("float");
}
public void print(Object x) {
System.out.print("Object");
}
public static void main(String[] args) {
Test t = new Test();
short s = 123;
t.print(s);
t.print(true);
t.print(6.789);
}
}Думаю, многих удивит результат в виде floatObjectObject.
И подобных вопросов в тесте хватает. Так что рекомендую как минимум сдать mock-тесты и подтянуть те темы, в которых вы могли бы совершить ошибку.
Несмотря на то что для подготовки к экзамену я использовал книгу OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808 авторства Jeanne Boyarsky и Scott Selikoff, я не согласен с мнением авторов, утверждающих, что новый экзамен намного сложнее предыдущего ОСА 8 (1Z0-808).
Так, например, я обнаружил всего несколько отличительных особенностей, которых не было в старом экзамене и книге OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808. Большинство из них — это фичи Java 9…11. Ниже я описал основные отличия новой версии экзамена от старой.
Немного из истории сертификации
Если бы вы сертифицировались по Java 8 и более ранним версиям, то могли сдавать два типа экзамена, каждый из которых давал соответствующий титул: Associate либо Professional. Теперь же появилось одно значительное изменение: титула Oracle Certified Associate (OCA) не существует, и сдача первого экзамена не даст вам ни сертификата, ни титула.
То есть чтобы получить сертификат Oracle Certified Professional 11 (OCP 11), вы должны сдать оба экзамена: и Java 11 Programmer I (1Z0-815), и Java 11 Programmer II (1Z0-816). Они основаны на старых OCA 8 (1Z0-808) и OCP 8 (1Z0-809) соответственно.
Немного о литературе для подготовки
Для общей подготовки я бы рекомендовала книгу OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808 авторства Jeanne Boyarsky и Scott Selikoff либо OCA Java SE 8 Programmer I Exam Guide (Exams 1Z0-808) авторства Bert Bates и Kathy Sierra. Рекомендую обязательно практиковаться в mock-тестах, приведенных в книгах.
Для изучения модульности — Java 9 Modularity Book.
Достаточно ознакомиться с соответствующими разделами в документации Oracle JDK 11 Documentation, чтобы узнать все, что необходимо, о var, List.of, интерфейсе Provider, StringBuilder.replace, String.intern и новых методах класса Arrays.
О процедуре заказа и прохождения экзамена
Регистрируемся на Pearson VUE и Oracle CertView, связываем аккаунты, заказываем, оплачиваем и идем сдавать. Сертификационных центров в Одессе нет, но в Киеве их хватает. К тому же график их работы довольно гибкий, так что есть повод навестить столичных друзей/родственников 😉
Касательно процедуры сдачи экзамена. Если вы сдавали экзамен на права, то это что-то похожее, но только дольше. Прийти в центр надо за 15–20 минут до указанного времени. Все личные вещи нужно сдать в ячейку. Перед началом самого экзамена вас фотографируют, просят подписать несколько бумаг и проверяют ваши документы (в моем случае это внутренний и загранпаспорт).
На экзамене вам выдают маркер и две ламинированные бумажки, на которых вы можете делать пометки. В процессе прохождения тестов можно помечать вопросы, чтобы вернуться к ним потом. Если вы выходите в уборную, то это происходит за счет времени экзамена (!).
Во время моей сдачи случилась примечательная ситуация: ближе к концу теста щелкнул свет, UPS не сработал, и компьютер ушел на перезагрузку, а мой мозг — в панический ступор 🙂
Но все данные уже были отправлены на сервер, и сессия сдачи экзамена продолжилась без учета времени, потраченного на перезагрузку ПК и вход в режим сдачи сессии.
Особенности подготовки к сертификационным экзаменам по java se
В статье мы кратко рассмотрим специфику сертификации Oracle, ее конкретные формы и взаимные отличия. Речь пойдет об экзаменах:
Oracle Certified Associate: Java SE 8 Developer, код 1Z0-808, 8-я версия Java, начальная ступень
Oracle Certified Professional: Java SE 8 Developer, код 1Z0-809, 8-я версия Java, профессиональная ступень
Oracle Certified Professional: Java SE 11 Developer, код 1Z0-819, 11-я версия Java, профессиональная ступень
Для удобства будем далее пользоваться просто кодами этих экзаменов: 808, 809, 819.
Прежде всего отметим, что для сдачи 808-го и 819-го экзаменов нет обязательных предпосылок: заявку может подать любой желающий, официального обучения на авторизованных Oracle-курсах проходить не надо, дополнительных сертификатов не требуется. С другой стороны, к сдаче 809-го допускают лишь тех, кто уже имеет 808-й сертификат.
Таким образом, мы видим, что 808/809 экзамены идут в связке. Каждый из них рассчитан на 150 минут и содержит 85 вопросов (компания Oracle непрерывно модифицирует свои экзамены, меняя не только число вопросов — то 72, то 75, а на сегодняшний день, как мы видим, их 85, — но порой редактирует содержание экзаменационных тем). Делается это для защиты от утечки экзаменационных материалов в сеть и для уточнения формулировок самих вопросов, так как в них категорически не должно быть неоднозначных трактовок, а этого добиться нелегко. В конце концов, даже в JLS (то есть в спецификации на язык) есть множество правил с оговорками, а также особенности конкретных имплементаций в стандартной библиотеке.
С другой стороны, в 819-м экзамене — который появился относительно недавно, в конце сентября 2020-го — отразились радикальные изменения, внесенные Oracle в каденцию релизов (как мы знаем, начиная с 9-й версии от сентября 2021, новые версии Java выходят теперь каждые полгода, в марте и сентябре).
Отметим, что те, кто уже имеет сертификацию по более старым версиям Java (например, 6 или 7), могут, что называется, «досдать» вопросы по обновленному материалу. Для этого имеется целый ряд узкопрофильных экзаменов, но здесь мы эту тему разбирать не будем (подробнее смотрите на
https://education.oracle.com/upgrade-ocp-java-6-7-8-to-java-se-11-developer/pexam_1Z0-817
).
Интересно отметить, что 819-й пришел на смену 815-му и 816-му экзаменам, которые очень напоминали ситуацию с 808/809: один экзамен был младшей ступени (ОСА), другой профессиональный (ОСР). Сейчас все изменилось: после сдачи 819-го экзаменующийся сразу получает сертификат разработчика профессионального уровня.
Более того, количество вопросов в 819-м резко сократилось: их только 50. Но радоваться рано:
во-первых, время тоже урезали. Если на 808/809 давали по 150 минут, то на 819-й отводится лишь 90 минут. Другими словами, интенсивность работы на экзамене сохраняется: в среднем по ~1 мин 45 сек на вопрос.
во-вторых, проходной балл повысили с 65% до 68%.
а в-третьих, поскольку объем экзаменационного материала объективно увеличился из-за появления новых фич, а число вопросов сократилось, теперь в одном вопросе идет проверка знаний по нескольким темам одновременно (раньше один вопрос всегда посвящался одной теме). Теперь представьте, что одну мину-растяжку в коде вы распознали и обезвредили, но вторую не заметили. Какой тогда будет балл за этот вопрос? Правильно: 0 %.
Справедливости ради приведем слова компании Oracle, в которой утверждают, что «новый подход позволяет не только уменьшить число вопросов, но и сделать их более приближенными к практике, а значит, уже не надо задавать вопросы тривиальные». И это правда. Беда лишь в том, что у экзамена идеальная память и он ничего не прощает. Кроме того, сдача 808-ого, пусть даже со скрипом, именно на тривиальных вопросах, даёт возможность получить сертификацию. Провал на 819-м не даст продвинуться вперед ни на йоту.
Это еще одна причина, почему Oracle перешел на новую систему: относительная несложность сдачи ОСА-экзамена привела к тому, что ценность сертификации как института была подорвана. Размылся фундамент. Вплоть до того, что отдельные — причем крупные и известные! — софтверные дома начали с ходу отметать резюме кандидатов, если там стояла строчка «имею сертификат». Изменив идеологию экзамена, Oracle практически гарантировал, что владелец сертификата профессионального уровня действительно много знает и умеет.
Но жизнь есть жизнь, и порой она предъявляет чисто формальные требования, например, при подаче заявки на тендер от компании-претендента могут потребовать иметь в своем штате N-й % сертифицированных разработчиков. В этой ситуации многие фирмы в срочном принудительном порядке организовывают обучение своих инженеров именно для получения ОСА-сертификата. И еще: с опытом успешной сдачи ОСА-экзамена, человек с большей уверенностью — да и шансом на успех!—сможет взяться за ОСР-экзамен. Он на порядок сложнее. Как минимум. Там все отнюдь не по-детски.
В каталоге Luxoft Training есть два курса (JVA-007, Разработка на платформе Java SE. Базовые темы и JVA-008, Разработка на платформе Java SE. Расширенные темы), тематика которых на 80%-90% совпадает с тематикой соответствующих экзаменов, а именно: JVA-007 ←→ 808 и JVA-008 ←→ 809.
В чем состоят отличия:

В 819-й экзамен в полном объеме входят:
808-й
809-й
плюс новые фичи, в первую очередь: модуляризированные системы, var-переменные, а также security
Из этого сопоставления видно, что курсы JVA-007 и JVA-008 разбирают материал более углубленно, чем это требуется для сдачи 808/809. Более того, ими в полной мере можно пользоваться для подготовки к сдаче 819-го. Впрочем, и там, и там потребуется самостоятельно «добрать» несколько тем, если предполагается сдавать экзамен.
Здесь надо еще раз подчеркнуть, что сертификация требует не только знаний теорматериала (их как раз можно получить на занятиях JVA-007 и JVA-008), но и специфических навыков, рассчитанных именно на сдачу экзамена (порядок чтения экзаменационных вопросов, приемы распознавания ловушек, мнемонические формулы для экономии времени, потому что именно время будет самым лимитированным ресурсом на экзамене и так далее). Наши курсы JVA-007 и JVA-008 рассчитаны в первую очередь на разработчиков. В JVA-008, к примеру, мы знакомимся с фреймворком модульного тестирования, потому что это органическое и логическое продолжение тематики аннотаций и рефлексии — а вот на экзамене, даже профессиональном и даже самом новейшем, этого и близко нет.
С другой стороны, в каталоге есть курсы JVA-077, Подготовка к сдаче сертификационного экзамена Oracle Java SE8 Programmer I (1Z0-808) и JVA-078, Подготовка к сдаче сертификационного экзамена Oracle Java SE8 Programmer II (1Z0-809), которые специально делают упор на приемы и навыки именно сдачи экзамена и, кроме разбора теории, дают слушателям специально подобранные задачи, максимально приближенные к реальному экзамену, в то время как JVA-007-й иJVA-008-й курсы опираются на лабораторный практикум более общего характера.
При выборе курса необходимо решить, в чем именно заключается цель обучения: общее повышение квалификации; максимальная отработка навыков на практике; получение сертификации – понимание методики сдачи и прохождения подводных камней; или, например, подготовка к прохождению тендеров, где требуется сертификация участников проекта.
Сомневаетесь в выборе? Свяжитесь с нами, и наши менеджеры помогут вам подобрать наиболее подходящий под ваши цели курс!
Курсы, упомянутые в статье:
JVA-007, Разработка на платформе Java SE. Базовые темы
JVA-008, Разработка на платформе Java SE. Расширенные темы
JVA-077, Подготовка к сдаче сертификационного экзамена Oracle Java SE8 Programmer I (1Z0-808)
JVA-078, Подготовка к сдаче сертификационного экзамена Oracle Java SE8 Programmer II (1Z0-809)
Подготовка к сертификации oracle java programmer (ocajp) | otus
Был президентским стипендиатом (одним из двух лучших студентов) в университете, занимался нелинейными динамическими системами, поведением нейронов и детерминистическим хаосом, учил немецкий язык – и в возрасте 18 лет отправился на свою первую, но не последнюю полугодовую практику на немецкую фирму DASA (DaimlerChrysler Aerospace), ставшую позже фирмой EADS (European Aeronautic Defence and Space), а ещё позже – Airbus. Там ещё в 90-х в качестве web-разработчика пробовал писать апплеты на Java. Апплеты дико не взлюбил, и как показало будущее, которого у апплетов не было, был прав.
В 2000 году по окончании университета, разминувшись тогда с готовой карьерой преподавателя, остался работать в Германии. А в 2002 году вместе со всем IT-отделом перешёл в немецкое подразделение американского IT-гиганта CSC, который не так давно слился с HP Enterprise в новую фирму – DXC, купившую всем известный Luxoft.
На данный момент, является председателем совета предприятия. Публицист. Спортивный журналист. Блогер.
Играет в “Что? Где? Когда?” (был чемпионом Германии), в компьютерные игры (на это, правда, совсем нет времени) и на скрипке (когда друзьям нужен кто-то, с кем можно сыграть дуэт).
Подпись (signature)
Класс Signature (java.security.Signature) используется для цифровой подписи данных. Когда данные подписаны, цифровая подпись создается из этих данных. Таким образом, подпись отделена от данных.
Цифровая подпись создается путем создания дайджеста сообщения (хеша) из данных и шифрования этого дайджеста сообщения с помощью закрытого ключа устройства, лица или организации, которая должна подписать данные. Дайджест зашифрованного сообщения называется цифровой подписью.
Для создания экземпляра Signature, вызывается метод Signature.getInstance (…):
Signature signature = Signature.getInstance("SHA256WithDSA");Подпись данных
Чтобы подписать данные, вы должны инициализировать экземпляр подписи в режиме подписи вызывая метод initSign(…), передавая закрытый ключ для подписи данных. Пример инициализации экземпляра подписи в режиме подписи:
signature.initSign(keyPair.getPrivate(), secureRandom);После инициализации экземпляра подписи, его можно использовать для подписи данных. Это делается вызовом метода update(), передавая данные для подписи в качестве параметра. Можно вызывать метод update() несколько раз, чтобы дополнить данные для создании подписи. После передачи всех данных в метод update(), вызывается метод sign() для получения цифровой подписи. Вот как это выглядит:
byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
signature.update(data);
byte[] digitalSignature = signature.sign();Полный пример подписи и проверки
SecureRandom secureRandom = new SecureRandom();
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
KeyPair keyPair = keyPairGenerator.generateKeyPair();
Signature signature = Signature.getInstance("SHA256WithDSA");
signature.initSign(keyPair.getPrivate(), secureRandom);
byte[] data = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
signature.update(data);
byte[] digitalSignature = signature.sign();
Signature signature2 = Signature.getInstance("SHA256WithDSA");
signature2.initVerify(keyPair.getPublic());
signature2.update(data);
boolean verified = signature2.verify(digitalSignature);
System.out.println("verified = " verified);Проверка подписи
Чтобы проверить подпись, нужно инициализировать экземпляр подписи в режиме проверки путем вызова метода initVerify(…), передавая в качестве параметра открытый ключ, который используется для проверки подписи. Пример инициализации экземпляра подписи в режиме проверки выглядит:
Signature signature = Signature.getInstance("SHA256WithDSA");
signature.initVerify(keyPair.getPublic());После инициализации в режиме проверки в метод update() передаются данные, которые подписаны подписью. Вызов метода verify(), возвращает значение true или false в зависимости от того, можно ли проверить подпись или нет. Вот как выглядит проверка подписи:
byte[] data2 = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");
signature2.update(data2);
boolean verified = signature2.verify(digitalSignature);Расширение криптографии java
Java cryptography API предоставляется так называемым расширением Java Сryptography Extension(JCE). JCE уже давно является частью платформы Java. Изначально JCE был отделен от Java из-за того, что в США действовали экспортные ограничения на технологии шифрования.
Поэтому самые стойкие алгоритмы шифрования не были включены в стандартную платформу Java. Эти более надежные алгоритмы шифрования можно применять, если ваша компания находится в США, но в остальных случаях придется применять более слабые алгоритмы или реализовывать свои собственные алгоритмы шифрования и подключать их к JCE.
С 2021 года правила экспорта алгоритмов шифрования в США были значительно ослаблены и в большей части мира можно пользоваться международными стандартами шифрования через Java JCE.
Архитектура криптографии Java
Java Cryptography Architecture (JCA) — название внутреннего дизайна API криптографии в Java. JCA структурирован вокруг нескольких основных классов и интерфейсов общего назначения. Реальная функциональность этих интерфейсов обеспечивается поставщиками.
Также можно реализовать и подключить свои собственные провайдеры, но вы должны быть осторожны с этим. Правильно реализовать шифрование без дыр в безопасности сложно! Если вы не знаете, что делаете, вам, вероятно, лучше использовать встроенный поставщик Java или использовать надежного поставщика, такого как Bouncy Castle.
Хранилище ключей (key store)
Java KeyStore — это база данных, которая может содержать ключи. Java KeyStore представлен классом KeyStore (java.security.KeyStore). Хранилище ключей может содержать ключи следующих типов:
Закрытый и открытый ключи используются в асимметричном шифровании. Открытый ключ может иметь связанный сертификат. Сертификат — это документ, удостоверяющий личность человека, организации или устройства, претендующего на владение открытым ключом.
Сертификат обычно имеет цифровую подпись проверяющей стороны в качестве доказательства.Секретные ключи используются в симметричном шифровании.Класс KeyStore довольно сложный, поэтому он описан более подробно далее в отдельной главе по Java KeyStore.
Java Keytool — это инструмент командной строки, который может работать с файлами Java KeyStore. Keytool может генерировать пары ключей в файл KeyStore, экспортировать сертификаты и импортировать сертификаты в KeyStore и некоторые другие функции. Keytool поставляется с установкой Java. Keytool более подробно описан далее в отдельной главе по Java Keytool.
Шифрование или дешифрование данных
После инициализации шифра вы можете начать шифрование или расшифровку данных вызовом методов update() или doFinal(). Метод update() используется, если вы шифруете или расшифровываете фрагмент данных. Метод doFinal() вызывается, когда вы шифруете последний фрагмент данных или если блок данных, который вы передаете в doFinal(), является единичным набором данных для шифрования.
Пример шифрования данных с помощью метода doFinal():
byte[] plainText = "abcdefghijklmnopqrstuvwxyz".getBytes("UTF-8");
byte[] cipherText = cipher.doFinal(plainText);Чтобы расшифровать данные, нужно передать зашифрованный текст(данные) в метод doFinal() или doUpdate().
Щепотка вдохновения
Результаты экзамена придут в течение 15 минут на вашу почту. Так что долго мучиться в догадках не придется. В целом экзамен имеет достаточно низкий проходной бал, поэтому после соответствующей подготовки, выполнения определенного количества mock-тестов и учета вышеизложенных советов и рекомендаций вы без труда получите результат, который вас удовлетворит.
Удачи и спасибо за внимание!
Заключение
В этой статье мы представили SSL и API JSSE, который реализует SSL для Java. Используя SSL и JSSE, мы можем сделать ваши Java-приложения и связь между приложениями и внутри приложения более безопасными.
Как всегда, код, представленный в этой статье, доступен на Github .
