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

Разработка 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 являются 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();


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 + "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


Lab
4.
jar

название нового архива


Lab
4*.
class

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



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



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


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


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


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


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


где:


-
genkey

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


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


-
keystore
Taraninstore

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


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


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



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


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

RSA


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

MD-5


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


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


jarsigner
-
keystore
Taraninstore
Lab
4.
jar
«
Taraninkey
»


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


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


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


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



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


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


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


В данной курсовом проекте для получения доступа к локальной файловой системе, для подписанного электронной цифровой подписью апплета, был создан пользовательский файл политики безопасностиLab
4.policy.



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


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


При запуске апплета в среде браузера MS IE 5(6) с модулем Javaplgu-in из JDK 1.4.x система безопасности задаёт вопрос о доверии поставщику, чьим сертификатом заеверен апплет.



При выборе пользователем ответаGrant
this
session
апплет получает полные права доступа ко всем ресурсам.Для обращения к локальной файловой системе пользователь может осущесвить чтение файла-журнала, хранящегося на локальном диске, нажав кнопку «
View
Certificate
».


При выборе пользователемDeny
апплет получает разрешене работать только с теми ресурсами, права доступа к которым прописаны в файлах политики безопасности. При выбореGrant
always
апплет получает полные права доступа ко всем ресурсам, при следующем запуске апплета не будет задаваться запрос о доверии поставщику, права доступа будут автоматически ко всем ресурсам.




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


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


1. Корниенко А.А., Кожомбердиева Г.И., Ерофеев П.В. Электронная цифровая подпись и безопасность Java-апплетов. Метод. указания. – СПб.: ПГУПС, 2005. – 28 с.


2. Корниенко А.А., Кожомбердиева Г.И., Киселев И.С. Методы криптографической защиты информации и их реализация на платформе Java: Метод. указания. – СПб.: ПГУПС, 2006. – 35 с


3. Ноутон П., Шилдт Г. Java 2: Пер. с англ. – СПб.: БХВ-Петербург, 2006


4. Java 2 SDK, Standard Edition Documentation, version 1.2.2.


5. Яворски Дж., Перроун П. Система безопасности Java, 2001.

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

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

Слов:2700
Символов:34315
Размер:67.02 Кб.