Государственное образовательное учреждение высшего профессионального образования
ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ
Кафедра «Информационные и вычислительные системы»
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту
по дисциплине «Методы программирования»
на тему: «Разработка 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();