Java Cryptography Extension
Криптографическое расширение Java (англ. Java Cryptography Extension, сокр. JCE) —официально выпущенное стандартное расширение для платформы Java и часть Java Cryptography Architecture(JCA). Представляет собой набор пакетов, который обеспечивает фреймворк и реализацию таких криптографических задач, как шифрование и дешифрование данных, генерация и проверка на подлинность ключей управления, а так же реализацию для и Message Authentication Code (MAC) алгоритмов[1].
Криптографическое расширение Java основано на том же, что и криптографическая архитектура Java (JCA) и рассматривается как часть JCA. Дело в том, что американские законы запрещают экспорт некоторых видов криптографического программного обеспечения(в частности симметричное шифрование и выработку общего ключевого материала) за пределы США и Канады или разрешают экспорт с урезанными ключами. Стандартные классы JCA содержат только хеш — функции, генераторы ключей и другие функции, которые не попадают под данное ограничение и могут быть спокойно экспортированы в составе платформы Java 2. Однако сильные алгоритмы шифрования, попадающие под экспортные ограничения на криптографию в США, должны быть получены из других источников, поэтому их поставляю в виде отдельного продукта - JCE.
Криптографическое расширение Java разработано таким образом, чтобы другие криптографические библиотеки могли быть подключены для предоставления новых алгоритмов без проблем[2].
Составляющие в JDK 1.2
На данный момент в JDK 1.2 криптографическое расширение поставляется в трех пакетах:
javax.crypto — интерфейс и классы для симметричного шифрования
javax.crypto.interfaces — интерфейсы средств выработки ключей для алгоритма Диффи-Хелмана
javax.crypto.spec — классы для управления ключами и параметрами криптографических алгоритмов
Функциональность
Как и JCA, JCE не зависит от реализации конкретных алгоритмов. Благодаря SPI различные реализации от разных производителей могут быть одновременно интегрированы в среде программирования Java. Начиная с версии 1.4, Java включает в себя JCE и JCA, однако другие реализации так же без каких-либо проблем могут быть подключены как статически, так и динамически.
Криптографическое расширение Java предлагает следующие функциональные возможности:
- Шифр — криптографические алгоритмы (симметричные и асимметричные) для шифрования, блочные и потоковые шифры
- Управление ключами — Классы KeyGenerator для генерации ключей, KeyAgreement для безопасного обмена ключами и SecretKeyFactory для разделения закрытого и открытого ключей
- Проверка на подлинность кодов
- Создание безопасных объектов и цифровых подписей
Аудитория JCE
У криптографического расширения Java есть функции безопасности, предназначенные для различных аудиторий
Пользователи
Встроенные функции безопасности JCE защищают пользователя от злонамеренных программ (включая вирусы), сохраняют конфиденциальность пользовательских файлов и информации о пользователе, проверяют подлинность личности каждого поставщика кода. Пользователь так же может подвергнуть приложения проверке на безопасность, когда ему это необходимо.
Разработчики
Разработчик может использовать методы JCE, чтобы включить функции безопасности в свои программы, в том числе криптографические службы и проверки безопасности. JCE позволяет определить и интегрировать свои собственные права доступа (контроль доступа к определенным ресурсам) и реализации криптографических служб безопасности. Кроме того, классы JCE предназначены для управления собственными приватными/частными парами ключей и сертифицирования открытых ключей от людей, которым доверяет разработчик[3].
Системные администраторы, разработчики и пользователи
Инструменты JCE управляют хранилищем ключей (база данных ключей и сертификатов); генерируют цифровые подписи для JAR-файлов, а также проверяют подлинность таких подписей и целостность подписанного содержимого; а также создавать и изменять приватные файлы, которые определяют безопасность их установки.
Известные реализации JCE
Среди различных реализаций JCE можно выделить пакет Cryptix JCE, пакет Bouncy Castle и пакет IAIK JCE.
Cryptix JCE
Пакет Cryptix JCE является самым известным из бесплатных расширений. Работа над ним началась в 1995 году. Это была первая доступная криптографическая библиотека для Java. Тогда криптография не имела широкой доступности, и данный проект играл важную роль в защите информации при разработке программ на Java платформе. Последняя версия Cryptix была выпущена 28 апреля 2005 года. В том же году поддержка Cryptix была прекращена.
Пакет Cryptix JCE включает в себя:
- Шифры Blowfish, CAST5, DES, IDEA, MARS, RC2, RC4, RC6, Rijndael, Serpent, SKIPJACK, Square, TripleDES, Twofish.
- Протоколы обмена ключами — Диффи-Хелмана
- Методы шифрования CBC, ECB, OFB
- Хэш-функции — MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-0, SHA-1, Tiger
- MAC-коды — HMAC-MD2, HMAC-MD4, HMAC-MD5, HMAC-RIPEMD-128, HMAC-RIPEMD-160, HMAC-SHA-0, HMAC-SHA-1, HMAC-Tiger
- Подписи — RawDSA, RSA
- Асимметричные шифры — ElGamal, RSA
Так же как и Cryptix JCE пакет Bouncy Castle является бесплатным. Первый официальный релиз Bouncy Castle появился в мае 2000 года и был длиной около 27 000 строк. Проект постоянно рос, и к 2012 году код Bouncy Castle для Java составлял более 300000 строк[1].
Он включает в себя
- реализацию протокола обмена Диффи-Хеллмана, включая версию алгоритма с эллиптическими кривыми.
- вычисление бесключевых хэш- функций сообщений — MD2, MD4, MD5, Tiger, RIPEMD, SHA
- вычисления ключевых хэш-функций сообщений — CMAC, HMAC
- асимметричное шифрование PKCS 1
- симметричное шифрование с помощью DES, TripleDES, AES, Blowfish, IDEA, RC2, RC4, RC5, RC6, Twofish, Skipjack и многих других шифров
- генераторы ключей, ключевых пар и других параметров криптографических алгоритмов.
- вычисления MAC с использованием любого блочного шифра, обрабатывающего текст блоками методом CBC, CFB, OFB
- алгоритмы электронной цифровой подписи RSA, DSA, EC-DSA
И обладает следующими свойствами
- содержит криптографические API для языков Java и C#
- содержит провайдер для JCE и JCA
- содержит реализации JCE 1.2.1, реализованные разработчиками самостоятельно (то есть пакет не содержит кодов JCE 1.2.1 от Sun, экспорт на который запрещен в США)
- поддерживает спецификации ASN.1 кодирования объектов
- поддержка сертификатов X.509 различных версий
- поддержка стандартов Open PGP, OCSP, TSP и др.
IAIK JCE
Коммерческий пакет, реализованный институтом прикладной обработки информации и связи (Institute for Applied Information Processing and Communication , IAIK) технологического университета Граца.
Примеры
Шифрование массива
В следующем примере показана реализация шифрования массива байтов с помощью алгоритма AES. Для написания программы использовались средства пакета Bouncycastle.[4]
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher( new CBCBlockCipher(new AESFastEngine()));
SecureRandom srr = new SecureRandom();
byte [] AESkey = new byte[16];
srr.nextBytes(AESkey);
byte [] AESinitV = new byte[16];
srr.nextBytes(AESinitV);
ParametersWithIV piv= new ParametersWithIV ((new KeyParameter(AESkey)), AESinitV);
cipher.init(true, piv);
byte[] result = new byte[cipher.getOutputSize( toEncrypt.length)];
int len = cipher.processBytes( toEncrypt, 0, toEncrypt.length, result, 0);
try {
cipher.doFinal(result, len);
} catch (CryptoException ce)
{ result = "Cipher error".getBytes();
ce.printStackTrace();
}
SecureRandom
SecureRandom это класс, который используется для генерации криптографически сильного псевдослучайного числа с помощью PRNG алгоритма. Есть два основных преимущества SecureRandom перед Random[3].
1. SecureRandom производит криптостойкого генератор псевдослучайных чисел.
2. SecureRandom производит криптостойкие последовательности, как описано в Randomness Recommendations for Security
package org.owasp.java.crypto;
import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;
/**
* @author Joe Prasanna Kumar
* This program provides the functionality for Generating a Secure Random Number.
*
* There are 2 ways to generate a Random number through SecureRandom.
* 1. By calling nextBytes method to generate Random Bytes
* 2. Using setSeed(byte[]) to reseed a Random object
*
*/
public class SecureRandomGen {
/**
* @param args
*/
public static void main(String[] args) {
try {
// Initialize a secure random number generator
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
// Method 1 - Calling nextBytes method to generate Random Bytes
byte[] bytes = new byte[512];
secureRandom.nextBytes(bytes);
// Printing the SecureRandom number by calling secureRandom.nextDouble()
System.out.println(" Secure Random # generated by calling nextBytes() is " + secureRandom.nextDouble());
// Method 2 - Using setSeed(byte[]) to reseed a Random object
int seedByteCount = 10;
byte[] seed = secureRandom.generateSeed(seedByteCount);
// TBR System.out.println(" Seed value is " + new BASE64Encoder().encode(seed));
secureRandom.setSeed(seed);
System.out.println(" Secure Random # generated using setSeed(byte[]) is " + secureRandom.nextDouble());
} catch (NoSuchAlgorithmException noSuchAlgo)
{
System.out.println(" No Such Algorithm exists " + noSuchAlgo);
}
}
}
Примечания
- ↑ 1 2 bouncycastle.org . www.bouncycastle.org. Дата обращения: 17 декабря 2016.
- ↑ Rich Helton. Johennie Helton. — 2002.
- ↑ 1 2 Jason Weiss. Practical Guide for Programmers. — 2004.
- ↑ М.С. Зуев, К.Г. Мирошников. Об одном криптографическом расширении Java (рус.) // Вестник ТГУ. — 2008. — 17 ноябрь.
Ссылки
- Java Cryptography Architecture (JCA) Reference Guide
- Скачать для Java 6, Java 7, и Java 8.
- IAIK-JCE
См. также
Это заготовка статьи о программном обеспечении. Помогите Википедии, дополнив её. |