Смекни!
smekni.com

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

Государственное образовательное учреждение высшего профессионального образования

ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ

Кафедра «Информационные и вычислительные системы»

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

по дисциплине «Методы программирования»

на тему: «Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью»

Выполнил:

студент группы КИБ-708

Таранин В.В.

Руководитель:

к.т.н., доц. Кожомбердиева Г.И.

Санкт-Петербург 2009

Задание

по курсовому проекту

по дисциплине «Методы программирования»

на тему: «Разработка Java-апплета и подписывание архивного JAR-файла электронной цифровой подписью»

· В качестве исходных данных к курсовому проекту используется апплет, являющийся результатом выполнения лабораторной работы №4«Разработка апплета с эффектом анимации на основе многопоточности Java».

Вариант задания №20

· Необходимо расширить функциональность апплета с эффектом анимации, реализовав обращение к локальной файловой системе.

· Создать архивный JAR-файл, содержащий апплет.

· Подписать JAR-файл электронной цифровой подписью (ЭЦП) и задать политику безопасности для подписанного апплета, включив в файл политики соответствующую запись, разрешающую доступ к локальной файловой системе и выполнение операций чтения-записи.

При выполнении курсового проекта использовать утилиты jar, keytool и jarsigner, а также комплект JDK 1.4.x с модулем plug-in для браузера MS IE 5,(6),(7).

Аннотация

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

Архивный JAR-файл, содержащий апплет, подписывается электронной цифровой подписью. Для апплета задается политика безопасности, путём создания пользовательского файла политики безопасности, который позволяет апплету получить доступ к локальной файловой системе и обеспечивающий возможность работы апплета за пределами модели безопасности Sandbox – «Песочница».

Подписанный электронной цифровой подписью апплет выполняется в среде MS IE с модулем plug-in из JDK 1.4.x.

После запуска апплета пользователю предоставляется возможность оказать доверие подписанному апплету и разрешить выполнение операций ввода-вывода в файл.

Содержание

Введение

1. Апплет с эффектом анимации на основе многопоточности Javaи обращением к локальной файловой системе

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

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

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

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

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

3. Выполнение подписанного апплета

Список использованных источников

Введение

Платформа Java 2 располагает мощной встроенной системой безопасности, включающая API-интерфейсы и механизмы, которые используются для обеспечения безопасности апплетов и приложений Java. Среди особенностей языка программирования Java, которые обеспечивают надежность и безопасность можно выделить: архитектурную независимость, интерпретируемость, переносимость, отсутствие указателей, строгую типизацию, эффективный механизм обработки исключений. Важными неотъемлимыми компонентами системы безопасности Java 2 являются Java Cryptography Architecture (JCA) – архитектура шифрования Java, а также Java Cryptography Extension (JCE) – криптографическое расширение Java.

Целью данного курсового проекта является – подписание архивного JAR-файла, содержащего апплет, электронной цифровой подписью, а также задание политики безопасности для подписанного апплета; ознакомление студентов с криптографическими методоми защиты информации и возможностями, которые предоставляет Java разработчиками программного обеспечения. Для этого необходимо: создать архивный JAR-файл, пары ключей и сертификата в хранилище ключей, далее подписать JAR-файл цифровой подписью и задать политику безопасности для подписанного апплета.

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

1. Апплет с эффектом анимации на основе многопоточности Javaи

обращением к локальной файловой системе

апплет архивный электронный цифровой подпись

importjava.applet.Applet;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

importjava.util.Calendar;

// Класс апплета, реализующий интерфейсы блоков прослушивания событий

public class Lab4 extends Applet implements ActionListener,ItemListener,Runnable

{

Panel p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,cards,pfield,pb,pread;

Label lb1,lb2,lb3;

CheckboxGroup cbg;

Checkbox cb1,cb2,cb3,cb4;

List list;

Canvas cv;

Button b1,b2,b3,b4,start,stop,read;

CardLayout cardLO;

Scrollbar sb1,sb2,sb3,sb4;

Color col;

int posX,strWidth;

FontMetrics fm;

int rectX=0,rectY=0,posFlag=0,movFlag=0,ovalX=0,ovalY=0;

int animFlag=0;

int rColor,gColor,bColor;

// Флаг остановки анимации

booleanstopFlag;

// Поток выполняющий анимацию

Threadt = null;

//Текстовая область для вывода содержимого файла журнала

TextAreafileText;

// Имя файла-журнала для записи информации о работе апплета

StringfileName = "";

// Разделитель строк (признак конца строки)

Stringls;

// Буферизированный символьный поток записи в файл

BufferedWriter out;

public void init()

{

setLayout(new GridLayout(2,2));

setForeground(Color.black);

col = Color.black;

// ЛЕВАЯ ВЕРХНЯЯ ПАНЕЛЬ

p1 = new Panel(new BorderLayout());

p1.setBackground(Color.lightGray);

p2= new Panel();

lb1 = new Label("Активная панель: ",lb1.CENTER);

p2.add(lb1);

p1.add(p2,BorderLayout.NORTH);

// Панель радиокнопок внутри ЛЕВОЙ ВЕРХНЕЙ панели

p3 = new Panel(new GridLayout(2,2));

cbg = new CheckboxGroup();

cb1= new Checkbox("Все панели",cbg,true);

cb2= new Checkbox("1-я панель",cbg,false);

cb3= new Checkbox("2-я панель",cbg,false);

cb4= new Checkbox("3-я панель",cbg,false);

cb1.addItemListener(this);

cb2.addItemListener(this);

cb3.addItemListener(this);

cb4.addItemListener(this);

p3.add(cb1);

p3.add(cb2);

p3.add(cb3);

p3.add(cb4);

p1.add(p3,BorderLayout.CENTER);

add(p1);

// ВЕРХНЯЯ ПРАВАЯ ПАНЕЛЬ

p4 = new Panel(new GridLayout(1,1));

list = new List(9,false);

list.add("Чёрный");

list.add("Синий");

list.add("Красный");

list.add("Зелёный");

list.add("Жёлтый");

list.add("Оранжевый");

list.add("Розовый");

list.add("Фиолетовый");

list.add("Тёмно-серый");

list.addItemListener(this);

p4.add(list);

add(p4);

// ЛЕВАЯ НИЖНЯЯ ПАНЕЛЬ

// Панель с кнопками

p5 = new Panel(new GridLayout(2,2));

b1 = new Button("Квадрат");

b2 = new Button("Круг");

b3 = new Button("Треугольник");

b4 = new Button("Строка");

b1.addActionListener(this);

b2.addActionListener(this);

b3.addActionListener(this);

b4.addActionListener(this);

p5.add(b1);

p7.add(b2);

p5.add(b3);

p5.add(b4);

pb = new Panel(new GridLayout(1,2,5,0));

lb2 = newLabel("Управление потоками",lb1.CENTER);

start = new Button("Запуск"); start.addActionListener(this);

stop = new Button("Остановка");stop.addActionListener(this);

pb.add(start);

pb.add(stop);

// !!! ПАНЕЛЬ ДЛЯ ЧТЕНИЯ ФАЙЛА-ЖУРНАЛА !!!

pfield = new Panel(new BorderLayout());

pread = new Panel(new GridLayout(3,1));

read = new Button("Чтение файла-журнала");

read.addActionListener(this);

// Текстовая область для вывода информации из файла журнала

fileText = newTextArea();

// Название файла-журнала задаётся параметром в HTML-файле

// или если такого нет – создаётся по умолчанию

fileName = getParameter("FileName");

if (fileName == null)

fileName = "log.txt";

ls = System.getProperty("line.separator"); // разделитель строк

fileText.setBackground(Color.white);

pread.add(lb2);

pread.add(pb);

pread.add(read);

pfield.add(p5,BorderLayout.NORTH);

pfield.add(pread,BorderLayout.CENTER);

pfield.add(fileText,BorderLayout.SOUTH);

add(pfield);

// ПРАВАЯ НИЖНЯЯ ПАНЕЛЬ

// ПАНЕЛЬ С КАРТАМИ (ГЛАВНАЯ)

cardLO = new CardLayout();

cards = new Panel();

cards.setLayout(cardLO);

cards.setBackground(Color.white);

posX = 65;

// ПЕРВАЯ ПАНЕЛЬ В КАРТАХ

p6 = new Panel(new BorderLayout())

{

public void paint(Graphics g)

{

if(animFlag==0)

{

g.setColor(col);

g.drawRect(rectX,rectY,50,50); }

}

};

// ВТОРАЯ ПАНЕЛЬ В КАРТАХ

p7 = new Panel(new BorderLayout())

{

public void paint(Graphics g)

{

if(animFlag==1)

{

g.setColor(col);

g.fillOval(ovalX,ovalY,50,50); }

}

};

// ТРЕТЬЯ ПАНЕЛЬ В КАРТАХ

p8 = new Panel(new BorderLayout())

{

public void paint(Graphics g)

{

g.setColor(col);

int x[] = {posX,posX+40,posX+80};

int y[] = {80,20,80};

g.drawPolygon(x,y,3);

}

};

sb3= new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,100);

sb3.addAdjustmentListener(new AdjustmentListener()

{

public void adjustmentValueChanged(AdjustmentEvent ae)

{

posX = (ae.getValue())*(cards.getSize().width -80) /sb3.getMaximum();

p8.repaint();

}

});

p8.add(sb3,BorderLayout.SOUTH);

// ЧЕТВЁРТАЯ ПАНЕЛЬ В КАРТАХ

P9 = new Panel(new BorderLayout())

{

public void paint(Graphics g)

{

fm = g.getFontMetrics();

strWidth = fm.stringWidth("J A V A");

g.setFont(new Font("Dialog",Font.ITALIC,20));

g.setColor(col);

g.drawString("J A V A",posX,65);

}

};

sb4= new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,5);

sb4.addAdjustmentListener(new AdjustmentListener()

{

public void adjustmentValueChanged(AdjustmentEvent ae)

{

posX = (ae.getValue())*(cards.getSize().width – strWidth)/sb4.getMaximum();

p9.repaint();

}

});

p9.add(sb4,BorderLayout.SOUTH);

// ДОБАВЛЕНИЕ КАРТ В ПАНЕЛЬ С КАРТАМИ (cards)

cards.add(p6,"sqaure");

cards.add(p7,"oval");

cards.add(p8,"rect");

cards.add(p9,"text");

add(cards);

// СОЗДАНИЕ БУФЕРИЗИРОВАННОГО СИМВОЛЬНОГО ПОТОКА ЗАПИСИ В ФАЙЛ

try

{

// В качестве параметра в данном конструкторе класса Buffered используется

// ссылка на объект основного потока (приёмника данных)

out = new BufferedWriter(new FileWriter(fileName));

}

catch(IOException ex)

{

fileText.setText("Ошибка при создании потока записи: " + ls);

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

}

catch(SecurityException ex)

{

fileText.setText("Нет разрешения доступа к файлу: " + ls);

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

read.setEnabled(false);

}

if (out != null)

{

// Если создание Buffered-потока прошло успешно то в качестве данных, которые

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

Calendar c = Calendar.getInstance();