Смекни!
smekni.com

Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью (стр. 2 из 3)

String dateMessage ="Дата и время: " + c.get(Calendar.DAY_OF_MONTH) + "/" +

(c.get(Calendar.MONTH)+1) + " – " + c.get(Calendar.YEAR) +

" " + c.get(Calendar.HOUR_OF_DAY) + ":" +

c.get(Calendar.MINUTE);

// После записи в String-переменную dateMessage информации о дате –

// вызывается метод writeLogMessage

writeLogMessage(dateMessage);

writeLogMessage("Инициализация апплета завершена");

}

/*--------------INIT--------------*/

}

// Вывод сообщения в буферизированный поток для записи в файл

privatevoidwriteLogMessage(Stringmessage)

{

// Запись в файл осуществляется вызовом метода write объек-та out типа BufferedWriter

try

{

out.write(message);

out.newLine();

}

catch(IOException ex)

{

fileText.setText("Ошибка записи в файл:" + ls);

fileText.append(ex.toString() + ls);

}

}

// Запускпотоков

public void run()

{

// Пока флаг остановки анимации равен false – происходит анимация

while (!stopFlag)

{

try

{

if(animFlag==0)

{

if(posFlag==0) // Начальное движение вправо по верхней грани

{

p6.repaint(); // Перерисовка

// Временное (на 40 мс) остановка потока для создания эффекта анимации

// Далее идут аналогичные изменения координат/

Thread.currentThread().sleep(40);

rectX+=5;

if(rectX>p6.getSize().width-50)

{

rectX-=7;

posFlag =1;

if(posFlag==1)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p6.repaint();

}

}

}

if(posFlag==1) // Движение вниз по правой грани

{

p6.repaint();

Thread.currentThread().sleep(40); // приостановить поток

rectY+=5;

if(rectY>p6.getSize().height – 50)

{

rectY=p6.getSize().height-53;

posFlag=2;

if(posFlag==2)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p6.repaint();

}

}

}

if(posFlag==2) // Движение влево по нижней грани

{

if(rectX>0)

{

p6.repaint();

Thread.currentThread().sleep(40);

rectX-=5;

}

else

{

rectX=0;

posFlag=3;

if(posFlag==3)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p6.repaint();

}

}

}

if(posFlag==3) // Движение вверх по левой грани

{

if(rectY>0)

{

p6.repaint();

Thread.currentThread().sleep(40);

rectY-=5;

if(rectY<0)

{

rectX=0;

rectY=0;

p6.repaint();

{

if(rectX==0 && rectY==0)

{

posFlag=0;

if(posFlag==0)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p6.repaint();

}

}

}

}

}

}

}

if(animFlag==1)

{

if(movFlag==0) // Движение по диагонали сверху в нижний угол

{

p7.repaint();

Thread.currentThread().sleep(50);

ovalX+=5;

ovalY+=5;

if(ovalX>p7.getSize().width-50)

{

ovalX = p7.getSize().width -50;

ovalY = p7.getSize().height-52;

movFlag =1;

if(movFlag==1)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p7.repaint();

}

}

}

if(movFlag==1) // Движение по нижней грани

{

p7.repaint();

Thread.currentThread().sleep(50);

ovalX-=5;

if(ovalX<0)

{

ovalX=0;

movFlag=2;

if(movFlag==2)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p7.repaint();

}

}

}

if(movFlag==2) // Движение по диагонали снизу вверх

{

p7.repaint();

Thread.currentThread().sleep(50);

ovalX+=5;

ovalY-=5;

if(ovalX>p7.getSize().width-50)

{

ovalX = p10.getSize().width – 52;

ovalY = 0;

movFlag=3;

if(movFlag==3)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p7.repaint();

}

}

}

if(movFlag==3) // Движение по верхней грани в обратном направлении

{

p7.repaint();

Thread.currentThread().sleep(50);

ovalX-=5;

if(ovalX<0)

{

ovalX = 0;

movFlag=0;

if(movFlag==0)

{

rColor = (int)(255*Math.random());

gColor = (int)(255*Math.random());

bColor = (int)(255*Math.random());

col = new Color(rColor,gColor,bColor);

p7.repaint();

}

}

}

}

}

catch (InterruptedException e)

{

return; // Завершить поток

}

}

}

//Реализация блоков прослушивания от кнопок

publicvoidactionPerformed(ActionEvente)

{

String ac = e.getActionCommand();

if(ac.equals("Квадрат"))

{

animFlag=0;

cardLO.show(cards,"sqaure");

writeLogMessage("Рисуется Квадрат");

}

if(ac.equals("Круг"))

{

animFlag=1;

cardLO.show(cards,"oval");

writeLogMessage("Рисуется Круг");

}

if(ac.equals("Треугольник"))

{

cardLO.show(cards,"rect");

}

if(ac.equals("Строка"))

{

cardLO.show(cards,"text");

}

else if("Запуск".equals(ac))

{

t = new Thread(this);

stopFlag = false;

t.start();

start.setEnabled(false);

writeLogMessage("Поток запущен");

}

else if("Остановка".equals(ac))

{

stopFlag=true;

t = null;

start.setEnabled(true);

writeLogMessage("Поток остановлен");

}

if("Чтение файла-журнала".equals(ac))

{

try

{

// Сброс данных из буфера потока (запись в файл)

out.flush();

// Далее происходит чтение из файла и заполнение текстовой области

// данными, содержащимися в текстовом файле Lab4Log.txt

// Создание буферизированного символьного потока чтения из файла*/

BufferedReader in = new BufferedReader(new FileReader(fileName));

String s = "", line;

while ((line = in.readLine()) != null)

s += line + "&bsol;n";

fileText.setText(s);

in.close();

}

catch(IOException ex)

{

fileText.setText("Ошибка чтения файла: " + ls);

fileText.append(ex.toString());

}

}

}

// Реализация блока прослушивания от списка Listи переключателей(CheckBox)

public void itemStateChanged(ItemEvent ie)

{

if(ie.getSource() == list)

{

String s = list.getSelectedItem();

if(s.equals("Чёрный"))

{

col = Color.black;

}

if(s.equals("Синий"))

{

col = Color.blue;

}

if(s.equals("Красный"))

{

col = Color.red;

}

if(s.equals("Зелёный"))

{

col = Color.green;

}

if(s.equals("Жёлтый"))

{

col = Color.yellow;

}

if(s.equals("Оранжевый"))

{

col = Color.orange;

}

if(s.equals("Розовый"))

{

col = Color.pink;

}

if(s.equals("Фиолетовый"))

{

col = Color.magenta;

}

if(s.equals("Тёмно-серый"))

{

col = Color.darkGray;

}

p6.repaint();

p7.repaint();

p8.repaint();

p9.repaint();

}

}

// Обработка события от CheckBox(Определение доступности панелей и их компонентов)

if(ie.getSource() == cb1)

{

p1.setEnabled(true);p4.setEnabled(true);

p7.setEnabled(true);

cards.setEnabled(true);

}

if(ie.getSource() == cb2)

{

p1.setEnabled(true);p4.setEnabled(true);

p7.setEnabled(false);

cards.setEnabled(false);

}

if(ie.getSource() == cb3)

{

p1.setEnabled(true);p4.setEnabled(false);

p7.setEnabled(true);

cards.setEnabled(false);

}

if(ie.getSource() == cb4)

{

p1.setEnabled(true);p4.setEnabled(false);

p7.setEnabled(false);

cards.setEnabled(true);

}

}

}

2. Создание подписанного апплета

2.1 Создание архивного JAR-файла

Для подписания апплета электронной цифровой подписью его упаковывают в архивный JAR-файл. В данной курсовой работе для этой цели используется утилита jar, либо можно использовать интегрированную среду разработки приложений.

Для создания архива применилась команда следующего вида:

jar cfv Lab4.jar Lab4*.class,

где: jarназвание утилиты, которая упаковывает файлы и создаёт архив

cfvэто набор из трёх параметров:

· с – указывает на то,что создаётся новый архив

· fпервый элемент в списке файлов – имя архива, который должен быть создан

· vвывод на консоль сообщений о всех действиях утилиты jar

Lab4.jarназвание нового архива

Lab4*.classпараметр указывает, что все файлы классов расположенные в текущем каталоге, размещаются в архивеLab4.jar


При этом утилита jar создаёт каталогMETA-INFс файлом описания архиваMANIFEST.MF

Также в HTML файле, используемом для запуска апплета были внесены изменения, а именно добавлен атрибут ARCHIVE элемента Applet. Значение атрибута ARCHIVE = Lab4.JAR.

2.2 Создание пары ключей и сертификата в хранилище ключей

Далее с помощью утилиты keytool создаётся пара ключей («открытый/закрытый») и сертификат по стандарту X.509 для псевдонима «Taraninkey» в хранилище ключейTaraninstore в текущем каталоге.

Для создания самоподписанного сертификата применилась команда:

keytool -genkey -alias «Taraninkey» -keystore Taraninstore,

где:

-genkeyпараметр указывающий, что утилита keytool должна сгенерировать ключи

-alias «Taraninkey» – псевдоним, под которым в хранилище ключей размещается сертификат

-keystoreTaraninstoreназвание хранилища ключей

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

В данном курсовом проекте пароль закрытого ключа «Taraninkey» – 123369, а пароль хранилища ключей «Taraninstore» – 123.

При создании ключей и подписании сертификата были использованы алгоритмы:

· Алгоритм ключа RSA

· Алгоритм подписи MD-5

2.3 Подписывание JAR-файла цифровой подписью

Архивный JAR-файл подписывается с помощью утилиты jarsigner. используя следующую команду:

jarsigner -keystoreTaraninstoreLab4.jar«Taraninkey»

Утилита требует ввести пароль хранилища ключей и пароль закрытого ключа после чего модифицирует файл описания архива MANIFEST.MF в каталоге META-INF архива.

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

Также в каталог META-INF архива добавляется файл подписиTARNINK.SF.

Содержимое файла подписи TARNINK.SF.

Файл подписи идентифицирует каждый из файлов в архиве, алгоритм дайджестасодержит для каждого файла значение дайджеста, вычисленного из записи файла в файле описания MANIFEST.MF.

На заключительном этапе подписания в каталог META-INF файла архива добавляется двоичный файл подписиTARANINK.RSA. Расширение файла подписи указывает, что утилита keytool использует алгоритм цифровой подписиRSA. Этот файл содержит подпись файла подписиTARNINK.SF и сертификат, заверяющий подлинность открытого ключа, соответствующего закрытому ключу, использованному при создании подписи.

2.4 Задание политики безопасности для подписанного апплета