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

Государственное образовательное учреждениевысшего профессионального образования
ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙСООБЩЕНИЯ
Кафедра «Информационные и вычислительные системы»
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту
по дисциплине «Методы программирования»
на тему: «Разработка 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 являются JavaCryptography Architecture (JCA) – архитектура шифрования Java, а также JavaCryptography Extension (JCE) – криптографическое расширение Java.
Цельюданного курсового проекта является – подписание архивного JAR-файла, содержащего апплет,электронной цифровой подписью, а также задание политики безопасности дляподписанного апплета; ознакомление студентов с криптографическими методомизащиты информации и возможностями, которые предоставляет Java разработчикамипрограммного обеспечения. Для этого необходимо: создать архивный JAR-файл, пары ключей и сертификата вхранилище ключей, далее подписать JAR-файл цифровой подписью и задать политику безопасности для подписанногоапплета.
Результатомданной курсовой работы является подписанный электронной цифровой подписьюапплет, имеющий возможность обращаться к локальной файловой системе.
 

1.  Апплет с эффектом анимации на основемногопоточности Javaи
обращениемк локальной файловой системе
апплет архивный электронный цифровой подпись
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Calendar;
//Класс апплета, реализующий интерфейсы блоков прослушивания событий
public class Lab4 extends Applet implementsActionListener,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;
//Поток выполняющий анимацию
Thread t = null;
//Текстоваяобласть для вывода содержимого файла журнала
TextAreafileText;
//Имя файла-журнала для записи информации о работе апплета
String fileName = “”;
// Разделительстрок (признак конца строки)
String ls;
//Буферизированный символьный поток записи в файл
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 = new Label(«Управление потоками»,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 = new TextArea();
// Названиефайла-журнала задаётся параметром в 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();
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————–*/
}
//Вывод сообщения в буферизированный поток для записи в файл
privatevoid writeLogMessage(String message)
{
// Записьв файл осуществляется вызовом метода 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
{
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
{
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
{
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; // Завершитьпоток
}
}
}
//Реализацияблоков прослушивания от кнопок
public void actionPerformed(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 + “\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Задание политики безопасности для подписанного апплета
Вданной курсовом проекте для получения доступа к локальной файловой системе, дляподписанного электронной цифровой подписью апплета, был создан пользовательскийфайл политики безопасностиLab4.policy.

/>
Содержимоеданного файла – набор разрешающих записей, в которых указываются права доступа,предоставляемые источнику кода апплета. Данная запись права доступапредоставляет право чтения/записи всех файлов файловой системы.
 

3.Выполнение подписанного апплета
Призапуске апплета в среде браузера MS IE 5(6) с модулем Java plgu-in изJDK 1.4.x система безопасности задаёт вопрос о доверии поставщику, чьимсертификатом заеверен апплет.
 
/>
 
Привыборе пользователем ответаGrantthissessionапплетполучает полные права доступа ко всем ресурсам.Для обращения клокальной файловой системе пользователь может осущесвить чтение файла-журнала,хранящегося на локальном диске, нажав кнопку«ViewCertificate».
Привыборе пользователемDenyапплетполучает разрешене работать только с теми ресурсами, права доступа к которымпрописаны в файлах политики безопасности. При выбореGrantalwaysапплет получает полные права доступако всем ресурсам, при следующем запуске апплета не будет задаваться запрос одоверии поставщику, права доступа будут автоматически ко всем ресурсам.
 

/>
 
Призапуске подписанного апплета под браузеромappletviewer апплетавтоматически получает права доступа к ресурсам, указанные в пользовательскомфайле политики безопасности, размещённом в текущем каталоге.
 

Списокиспользованных источников
 
1.  Корниенко А.А., Кожомбердиева Г.И.,Ерофеев П.В. Электронная цифровая подпись и безопасность Java-апплетов. Метод.указания. – СПб.: ПГУПС, 2005. – 28 с.
2.  Корниенко А.А., Кожомбердиева Г.И.,Киселев И.С. Методы криптографической защиты информации и их реализация наплатформе Java: Метод. указания. – СПб.: ПГУПС,2006. – 35 с
3.  Ноутон П., Шилдт Г. Java 2: Пер. с англ. – СПб.:БХВ-Петербург, 2006
4.  Java 2 SDK, StandardEdition Documentation, version 1.2.2.
5.  Яворски Дж., Перроун П. Системабезопасности Java, 2001.