Меню

Java генератор ключей для

Криптография в Java. Класс KeyPair

Привет, Хабр! Представляю вашему вниманию перевод 6, 7 и 8 статей автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.

Оглавление:

Ключевая пара

Класс KeyPair (java.security.KeyPair) представляет собой пару асимметричных ключей (открытый ключ + закрытый ключ). Экземпляр KeyPair обычно используется в асимметричной криптографии(шифрование или подпись данных). Обычно экземпляр KeyPair получают из хранилища ключей Java или KeyPairGenerator который будет рассмотрен далее в этой статье.

Доступ к открытому ключу

Вы можете получить доступ к открытому ключу экземпляра KeyPair, вызвав его метод getPublic(). Пример получения открытого ключа:

Доступ к закрытому ключу

Так же можно получить доступ к закрытому ключу экземпляра KeyPair, вызвав его метод getPrivate(). Вот пример получения закрытого ключа:

Генератор ключей

Класс KeyGenerator (javax.crypto.KeyGenerator) используется для генерации симметричных ключей шифрования. Симметричный ключ шифрования — это ключ, который используется для шифрования и дешифрования данных алгоритмом симметричного шифрования.

Создание экземпляра KeyGenerator

Прежде чем вы сможете использовать класс KeyGenerator, вы должны создать экземпляр KeyGenerator. Экземпляр KeyGenerator создается вызывом статического метода getInstance(), в качестве параметра принимающего имя алгоритма шифрования, для которого создается ключ. Вот пример создания экземпляра KeyGenerator:

В этом примере создается экземпляр KeyGenerator, который может генерировать ключи для алгоритма шифрования AES.

Инициализация KeyGenerator

После создания экземпляра KeyGenerator его необходимо инициализировать. Инициализация экземпляра выполняется путем вызова метода init(). Пример инициализации экземпляра KeyGenerator:

Метод init() принимает два параметра: длина ключа и SecureRandom, который используется во время генерации ключа.

Генерация ключа

После инициализации экземпляра KeyGenerator вы можете использовать его для генерации ключей. Генерация ключа выполняется путем вызова метода generateKey(). Вот пример генерации симметричного ключа:

Генератор ключевой пары

Класс KeyPairGenerator (java.security.KeyPairGenerator) используется для генерации асимметричных ключевых пар. Пара асимметричных ключей состоит из двух ключей: первый ключ обычно используется для шифрования данных, а второй ключ используется для расшифровки данных, зашифрованных с помощью первого ключа.

Открытые и закрытые ключи

Наиболее известным типом пары асимметричных ключей является тип пары ключей вида: открытый ключ + закрытый ключ. Закрытый ключ используется для шифрования данных, а открытый ключ — для расшифровки данных. На самом деле, вы также можете зашифровать данные с помощью открытого ключа и расшифровать его с помощью закрытого ключа. Закрытый ключ обычно хранится в секрете, а открытый ключ может быть известен всем. Таким образом, если Джек зашифровывает некоторые данные своим закрытым ключом, каждый, кто владеет открытым ключом Джека, может расшифровать его.

Создание экземпляра KeyPairGenerator

Чтобы использовать KeyPairGenerator, вы должны сначала создать экземпляр класса KeyPairGenerator. Создание экземпляра KeyPairGenerator выполняется путем вызова метода getInstance(). Вот пример создания экземпляра:

Метод getInstance() принимает имя алгоритма шифрования, который будет использоваться. В этом примере мы используем алгоритм RSA.

Инициализация KeyPairGenerator

В зависимости от алгоритма, вам может потребоваться инициализация экземпляра KeyPairGenerator. Инициализация KeyPairGenerator выполняется путем вызова его метода initialize(). Пример инициализации экземпляра KeyPairGenerator:

В этом примере инициализируется KeyPairGenerator для генерации ключей размером 2048 бит.

Генерация ключевой пары

Чтобы сгенерировать ключевую пару с помощью KeyPairGenerator вызывается метод generateKeyPair(). Вот пример генерации ключевой пары:

Источник

Криптография в Java. Утилита Keytool

Привет, Хабр! Представляю вашему вниманию перевод 10 статьи «Java Keytool» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.

Оглавление:

Утилита Keytool

Java Keytool — это инструмент командной строки, который может генерировать пары открытый ключ / закрытый ключ и сохранять их в хранилище ключей. Исполняемый файл утилиты распространяется вместе с Java SDK (или JRE), поэтому, если у вас установлен SDK, значит она у вас также будет предустановлена.
Исполняемый файл называется keytool . Чтобы выполнить его, откройте командную строку (cmd, console, shell и т.д.). и измените текущий каталог на каталог bin в каталоге установки Java SDK. Введите keytool , а затем нажмите клавишу Enter . Вы должны увидеть что-то похожее на это:

Как видите, утилита keytool поддерживает набор команд для работы с ключами, сертификатами и хранилищами ключей. В этом руководстве будут рассмотрены наиболее часто используемые из этих команд.

Скрипты Keytool

Команды утилиты Keytool принимают много аргументов, правильность установки которых может быть трудно запомнить. Поэтому рекомендуется создать несколько скриптов CMD или Shell с последовательностью команд Keytool . Эти сценарии упрощают повторное выполнение команд, а также позволяют вернуться назад и посмотреть, как было создано хранилище ключей.

Генерация ключевой пары

Генерация ключевой пары (открытый ключ / закрытый ключ) является одной из наиболее распространенных задач, для которых используется утилита Keytool . Сгенерированная пара ключей вставляется в файл KeyStore как пара ключей с собственной подписью. Вот общий формат командной строки для генерации пары ключей:

Аргументы объяснены в разделе Аргументы Keytool. Не все эти аргументы нужны и многие являются не обязательными. Утилита сообщит вам, если вы пропустили обязательный аргумент. Вот пример команды, которая импортирует сертификат в KeyStore. Не забудьте удалить разрывы строк при вводе команды в командной строке.

Список записей хранилища

Чтобы вывести список записей в хранилище ключей, вы можете использовать команду list . Ниже представлен формат для команды list . Разрывы строк предназначены только для упрощения чтения. Удалите разрывы строк перед выполнением команды:

Вот пример команды list . Не забудьте удалить разрывы строк!

Эта команда выведет список всех записей в данном хранилище ключей. Результат выполнения будет выглядеть примерно так:

Если вы включите аргумент alias в команду list , в список попадет только запись, соответствующая данному псевдониму. Вот пример команды list с аргументом alias :

Результат выполнения вышеупомянутой команды:

Удаление записи хранилища ключей

Так же в в утилите keytool имеется команда, которая может удалить запись из хранилища ключей: delete . Вот формат этой команды:

Вот пример вызова команды delete . Не забудьте удалить разрывы строк перед запуском!

Эта команда удаляет запись хранилища с псевдонимом testkey хранящегося в файле keystore.jks .

Генерация запроса на сертификат

Утилита keytool может генерировать запрос сертификата с помощью команды certreq . Запрос сертификата — это запрос к центру сертификации (ЦС) на создание публичного сертификата для вашей организации. После создания запроса на сертификат он должен быть отправлен в центр сертификации, в котором вы хотите создать сертификат (например, Verisign, Thawte или какой-либо другой центр сертификации). Прежде чем вы сможете сгенерировать запрос сертификата для личного ключа и пары открытых ключей, вы должны сгенерировать этот закрытый ключ и пару открытых ключей в хранилище ключей (или импортировать его). Как это сделать можно посмотреть в соответсвтующей главе. Вот формат команды для генерации запроса сертификата. Не забудьте удалить все разрывы строк при использовании этой команды:

Вот пример команды -certreq :

Эта команда сгенерирует запрос сертификата для ключа, сохраненного с псевдонимом testkey в файле keystore.jks , и запишет запрос сертификата в файл с именем certreq.certreq .

Аргументы утилиты keytool

Ниже приведен список аргументов, которые принимают различные команды keytool . Помните, что не все команды принимают все эти аргументы. Посмотрите на конкретную команду, чтобы увидеть, какие аргументы она принимает.

  • -alias Псевдоним записи в хранилище ключей. Помните, псевдоним
    может указывать только на один ключ.
  • -keyalg Название алгоритма, используемого для генерации ключа. Обычно используется RSA.
  • -keysize Размер ключа в битах. Обычно размеры ключа кратны. Кроме того, различные алгоритмы могут поддерживать только определенные предварительно заданные размеры ключей.
  • -sigalg Алгоритм подписи, используемый для подписи пары ключей.
  • -dname Уникальное имя из стандарта X.500. Это имя будет связано с
    псевдонимом для этой пары ключей в хранилище ключей, также
    используется в качестве полей «эмитент» и «субъект» в самозаверяющем
    сертификате.
  • -keypass Пароль ключевой пары, необходимый для
    доступа к этой конкретной паре ключей в хранилище ключей.
  • -validity Количество дней, в течение которых сертификат,
    приложенный к паре ключей, должен быть действительным.
  • -storetype Формат файла, в котором должно быть сохранено хранилище ключей. По умолчанию используется JKS. Другим вариантом является формат PKCS11.
  • -keystore Имя файла хранилища для хранения сгенерированной пары
    ключей. Если файл не существует, он будет создан.
  • -file Имя файла для чтения или записи сертификата или запроса сертификата.
  • -storepass Пароль от хранилища ключей, всем, кто захочет работать
    с ним, понадобится этот пароль. Отличие storepass от keypass в
    том что первый предоставляет доступ к хранилищу, а второй к отдельной
    паре ключей. Вам понадобятся оба пароля для доступа к любому ключу,
    хранящемуся в хранилище.
  • -rfc Если включить этот флаг, то утилита будет использовать текстовый формат, а не двоичный формат, например для экспорта или импорта сертификатов. Значение -rfc
    относится к стандарту RFC 1421.
  • -providerName Имя провайдера криптографического API, который вы хотите использовать при создании пары ключей. Имя провайдера должно быть указано в файлах свойств безопасности Java.
  • -providerClass Имя корневого класса провайдера криптографического API, который вы хотите использовать. Используется когда имя провайдера не указано в файлах свойств безопасности Java.
  • -providerArg Аргументы, передаваемые собственному криптографическому провайдеру при инициализации (если это необходимо провайдеру).
  • -v Сокращенное от verbose, утилита Keytool будет выводить много дополнительной информации в командную строку в удобочитаемом формате.
  • -protected Определяет, должен ли пароль хранилища ключей предоставляться каким-либо внешним механизмом, например, аппаратный токен. Допустимые значения: true и false.
  • -Jjavaoption Строка опций для Java VM которая генерирует пару ключей и создает хранилище.

Источник

Криптография в Java. Класс KeyStore

Привет, Хабр! Представляю вашему вниманию перевод 9 статьи «Java KeyStore» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.

Оглавление:

Хранилище ключей

Java KeyStore — это хранилище ключей в виде базы данных, представленное классом KeyStore (java.security.KeyStore). Хранилище можно записать на диск и снова прочитать, оно может быть защищено паролем, а каждая запись ключа в хранилище ключей может быть защищена собственным паролем, что делает класс KeyStore полезным механизмом для безопасной работы с ключами шифрования. Хранилище ключей может содержать ключи следующих типов:

  • Закрытые ключи (Private keys)
  • Открытые ключи и сертификаты(Public keys + certificates)
  • Секретные ключи (Secret keys)

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

Создание хранилища ключей

Вы можете создать экземпляр KeyStore , вызвав его метод getInstance() . Вот пример создания экземпляра класса:

В этом примере создается экземпляр KeyStore по умолчанию. Также можно создавать экземпляры KeyStore с другим форматом хранения ключа, передавая параметр в метод getInstance() . Например создание экземпляра хранилища ключей PKCS12 :

Загрузка хранилища ключей

Прежде чем использовать экземпляр хранилища ключей, его необходимо загрузить. Экземпляры класса KeyStore часто записываются на диск или в другое хранилище для последующего использования, потому класс KeyStore предполагает, что вы должны прочитать его данные, прежде чем сможете его использовать. Однако можно инициализировать пустой экземпляр KeyStore без данных, как вы увидите позже.

Загрузка данных из файла или другого хранилища выполняется путем вызова метода load() который принимает два параметра:

  • InputStream из которого будут загружены данные.
  • char[] Массив символов, содержащий пароль от хранилища ключей.

Вот пример загрузки хранилища ключей:

В этом примере загружается файл хранилища ключей keystore.ks. Если вы не хотите загружать какие-либо данные в хранилище ключей, просто передайте значение null для параметра InputStream . Вот как выглядит загрузка пустого хранилища ключей:

Экземпляр класса KeyStore всегда должен загружаться либо с данными, либо с null . В противном случае хранилище ключей не инициализируется, и все вызовы его методов будут вызывать исключения.

Получение ключей

Вы можете получить ключи экземпляра класса KeyStore через его метод getEntry() . Запись хранилища ключей сопоставлена с псевдонимом (alias), который идентифицирует ключ, и защищена паролем ключа. Таким образом, чтобы получить доступ к ключу, вы должны передать псевдоним ключа и пароль методу getEntry() . Вот пример доступа к записи в экземпляре KeyStore :

Если вы знаете, что запись, к которой вы хотите получить доступ, является закрытым ключом, вы можете преобразовать экземпляр KeyStore.Entry в KeyStore.PrivateKeyEntry . Вот как это выглядит:

После приведения к KeyStore.PrivateKeyEntry вы можете получить доступ к закрытому ключу, сертификату и цепочке сертификатов с помощью следующих методов:

  • getPrivateKey()
  • getCertificate()
  • getCertificateChain()

Помещение ключей в хранилище

Вы также можете поместить ключи в экземпляр класса KeyStore . Пример помещения секретного ключа (симметричного ключа) в экземпляр KeyStore :

Хранение

Иногда вы можете захотеть сохранить хранилище ключей на какое-либо хранилище (диск, база данных и т. д.), чтобы вы могли загрузить его снова в другой раз. Экземпляр класса KeyStore сохраняется вызовом метода store() . Пример:

Источник

Adblock
detector