СОДЕРЖАНИЕ
1.1 Понятие, законодательное регулирование и виды электронных подписей
.2 Анализ существующих систем учета электронных подписей
.4 Выбор решения и его обоснование
2.1 Выбор модели проектирования
.2 Разработка структурной схемы приложения
.5 Разработка структуры базы данных
.6 Проектирование интерфейса приложения
3. РАСЧЕТ ЗАТРАТ НА ВНЕДРЕНИЕ СИСТЕМЫ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1.1 Понятие, законодательное регулирование и виды электронных подписей
1.2 Анализ существующих систем учета электронных подписей
1.4 Выбор решения и его обоснование
2.1 Выбор модели проектирования
2.2 Разработка структурной схемы приложения
2.5 Разработка структуры базы данных
2.6 Проектирование интерфейса приложения
3. РАСЧЕТ ЗАТРАТ НА ВНЕДРЕНИЕ СИСТЕМЫ
В результате приведенной выше информации можно сделать вывод, что разработка приложения для учета электронных подписей компании является экономически целесообразной.
В ходе создания дипломной работы по проектированию и разработке приложения для учета электронных подписей в организации были решены следующие задачи.
Проведен анализ предметной области. Перед производством технических работ по разработке приложения в рамках данного раздела было изучено такое средство защиты информации, как электронная подпись. Были изучены принципы ее формирования, разновидности, программные средства, необходимые для ее создания, а также правовые основы, на которых на территории Российской Федерации используется электронная подпись.
Произведено проектирование приложения с помощью универсального языка моделирования (UML). В рамках проектирования были построены следующие типы диаграмм (перед построением каждого типа диаграмм приведено краткое описание данного типа диаграммы):
структурная диаграмма приложения для учета электронных подписей, описывающая структуру приложения и взаимодействие частей приложения друг с другом;
диаграмма прецедентов (UseCase-диаграмма) - описание действий пользователя при работе с приложением;
диаграмма компонентов приложения, описывающая отдельные части приложения и взаимодействие между ними; данная диаграмма схода по назначению со структурной диаграммой, однако же, в отличие от нее, учитывает особенности программной реализации приложения (в частности, использование PHP-фреймворка Yii2);
диаграммы классов приложения для ПК и серверного Web-приложения; также было приведено краткое описание классов, представленных на данных диаграммах;
ER-диаграмма базы данных приложения для учета электронных подписей, где описаны сущности и связи между ними; данная диаграмма зачастую не включается в множество языка проектирования UML, однако же играет чрезвычайно важную роль в проектировании любого приложения, которое использует базу данных для хранения информации.
Построены макеты окон приложения для ПК, а также макеты страниц Web-приложения.
Произведен выбор инструментария, используемый для реализации Web-приложения и приложения для ПК:
язык программирования PHP и PHP-фреймворк (программная платформа) Yii2;
реляционная система управления базами данных MySQL;
язык программирования C#;
программная платформа для разработки Windows-приложений .NET Framework 4.0;
среда визуальной разработки Visual Studio 2015.
В качестве операционной системы для работы приложения для ПК была использована операционная система Windows 7 64-х разрядная, а для Web-приложения - 64-х разрядная операционная система Ubuntu 16.04.
В качестве подтверждения правильности работы приложений в разделе, описывающем реализацию приложения, приведены снимки окон приложения для ПК, а также Web-приложения с выведенными результатами работы.
На этом проектирование и разработку приложения для учета электронных подписей можно считать завершенной.
1. Виссер Дж. Разработка обслуживаемых программ на языке C# / Виссер Дж. - Москва: ДМК Пресс, 2016. - 292 с.
2. Рихтер, Дж. CLR via C#. Программирование на платформе Microsoft .NET Framework4.0 на языке C#. 3-е изд. - СПб.: Питер, 2012. - 982 с.
. Албахари Д. C# 6.0. Справочник. Полное описание языка. 6-е изд. / Албахари Д., Албахари Б. - Москва: OReilly, 2016. - 1040 с.
4. Гольцман В. MySQL 5.0. Библиотека программиста / СПб: Питер, 2010. - 253 с.
5. Шлосснейгл Дж., Профессиональное программирование на PHP / Москва: Вильямс, 2006. - 624 с.
. Симдянов И. PHP 7. В подлиннике / Симдянов И., Котеров Д. - Санкт-Петербург: БХВ-Петербург, 2016. - 1073 с.
. Исаев Г.Н. Проектирование информационных систем / Москва: Омега-Л-Москва, 2015. - 512 с.
. Проектирование информационных систем (на примере методов структурного системного анализа): учебное пособие / сост. О. Г. Инюшкина. - Екатеринбург: Форт-Диалог Исеть, 2014. - 240 с.
. Леоненков А. Самоучитель языка UML. - СПб: БХВ-Петербург, 2007. - 576 с.
. Буч Г., Рамбо Д., Якобсон А. Язык UML. Руководство пользователя. Второе издание. ДМК, 2006, 496 с
11. Теслюк Л.М. Оценка эффективности инвестиционного проекта / Теслюк Л.М., Румянцева А.В. - Москва: Фолио, 2011 - 145 с.
(информационное)
Листинг Web-приложения
class Files extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'Files';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'path', 'mimo', 'size', 'dateAdd'], 'required'],
[['name', 'path', 'mimo'], 'string'],
[['size'], 'integer'],
[['dateAdd'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Name',
'path' => 'Path',
'mimo' => 'Mimo',
'size' => 'Size',
'dateAdd' => 'Date Add',
];
}
}Users extends \yii\db\ActiveRecord implements IdentityInterface
{
const SCENARIO_LOGIN = 'login';
const SCENARIO_PROFILE = 'profile';
public $entranceIds = [];
public static function tableName()
{
return 'Users';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['login', 'password'], 'required', 'message' => 'Поле не должно быть пустым'],
[['login'], 'safe'],
[['enabled'], 'integer'],
[['password'], 'string', 'max' => 40],
];
}function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_LOGIN] = ['login', 'password'];
$scenarios[self::SCENARIO_PROFILE] = ['login'];
return $scenarios;
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'login' => 'Login',
'password' => 'Password',
'lastLogin' => 'Last Login',
'enabled' => 'Enabled',
];
}
public static function login($login, $password)
{
$user = self::find()->where(['login' => $login, 'password' => sha1($password)])->one();
if ($user && isset($user->id) && $user->id)
{
Yii::$app->getUser()->login($user);
return true;
}
else
{
return false;
}
}
public static function findIdentity($id)
{
return static::findOne($id);
}
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
public function getId()
{
return $this->id;
}
public function getAuthKey()
{
return $this->authKey;
}
public function validateAuthKey($authKey)
{
return $this->authKey === $authKey;
}
}frontend\controllers;yii\web\Controller;app\models\Users;yii\web\Response;Yii;yii\data\ActiveDataProvider;yii\helpers\ArrayHelper;UsersController extends AuthController
{
public $ipp = 20;
public function actionIndex()
{
$query = Users::find();
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10
]
]);
return $this->render('index', [
'provider' => $provider
]);
}
public function actionEdit()
{
$id = Yii::$app->request->get('id', null);
if ($id)
{
$model = Users::find()->where(['id' => $id])->one();
}
else
{
$model = new Users();
}
$model->scenario = 'profile';
if (Yii::$app->request->isPost)
{
$post = Yii::$app->request->post('Users');
$model->setAttributes ($post, false);
if (!empty($post['password']))
$model->password = sha1($post['password']);
$model->status = 'user';
$model->save(false);
return $this->redirect('/users');
}
return $this->render('edit', [
'model' => $model,
]);
}
public function actionDelete()
{
$id = Yii::$app->request->get('id', null);
if ($id)
{
$model = Users::find()->where(['id' => $id])->one();
$model->delete();
return $this->redirect('/users');
}
return $this->redirect('/users');
}
}
(информационное)
Листинг приложения для ПК
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
NetworkChecker nc = new NetworkChecker();
if (!nc.checkNetwork())
{
MessageBox.Show("Соединение с Интернетом отсутствует или ограничено!");
Application.Exit();
}
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "" || textBox2.Text == "")
{
MessageBox.Show("Для авторизации необходимо ввести имя пользователя и пароль!");
return;
}
ApiAdapter a = new ApiAdapter();
if (a.login(textBox1.Text, textBox2.Text) > 0)
{
FormAccount fa = new FormAccount();
fa.Show();
this.Hide();
}
else
{
MessageBox.Show("Неверное имя пользователя или пароль!");
}
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
class ApiAdapter
{
public String domain = "";
public static int userId = 0;
public static String userName = "";
public static String password = "";
public static String fullName = "";
public int login(String login, String password)
{
ReqParam p1 = new ReqParam();
p1.name = "login";
p1.value = login;
ReqParam p2 = new ReqParam();
p2.name = "password";
p2.value = password;
ReqParam p3 = new ReqParam();
p3.name = "type";
p3.value = "json";
List<ReqParam> pl = new List<ReqParam>(0);
pl.Add(p1);
pl.Add(p2);
pl.Add(p3);
JObject lr = this.getRequest("/login/login", pl);
String r = lr.GetValue("result").ToString();
if (r == "True")
{
ApiAdapter.userId = Convert.ToInt32(lr.GetValue("userId").ToString());
ApiAdapter.userName = lr.GetValue("login").ToString();
ApiAdapter.fullName = lr.GetValue("fullName").ToString();
}
return ApiAdapter.userId;
}
public JObject getRequest(String uri, List<ReqParam> pl)
{
String url = this.domain + uri + "?";
for (int i = 0; i < pl.Count; i++)
{
if (i > 0)
url += "&";
url += (pl[i].join());
}
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
try
{
HttpWebResponse responce = (HttpWebResponse)request.GetResponse();
if (responce.StatusCode != HttpStatusCode.OK)
{
return null;
}
using (StreamReader sr = new StreamReader(responce.GetResponseStream()))
{
String json = sr.ReadToEnd();
JObject jObject = JObject.Parse(json);
return jObject;
}
}
catch
{
return null;
}
}
}
public class CertCenterModel
{
public int id = 0;
public String name = "";
public String ocspUrl = "";
}
public class CertificateModel
{
public int id = 0;
public String fullName = "";
public int centerId = 0;
public String position = "";
public String companyName = "";
public String INN = "";
public String KPP = "";
public int fileId = 0;
public String fileUrl = "";
}
public class SignatureModel {
public int id = 0;
public String name = "";
public String url = "";
public String signatureUrl = "";
public int signatureId = 0;
}
public class ReqParam
{
public String name = "";
public String value = "";
public String join()
{
return this.name + "=" + this.value;
}
}
public class NetworkChecker
{
public Boolean checkNetwork()
{
Boolean res = true;
try
{
IPHostEntry entry = Dns.GetHostEntry("dns.msftncsi.com");
if (entry.AddressList.Length == 0)
{
return false;
}
else
{
if (!entry.AddressList[0].ToString().Equals("131.107.255.255"))
{
return false;
}
}
}
catch
{
return false;
}
// Проверить загрузку документа ncsi.txt
{
HttpWebResponse responce = (HttpWebResponse)request.GetResponse();
if (responce.StatusCode != HttpStatusCode.OK)
{
return false;
}
using (System.IO.StreamReader sr = new StreamReader(responce.GetResponseStream()))
{
if (sr.ReadToEnd().Equals("Microsoft NCSI"))
{
return true;
}
else
{
return false;
}
}
}
catch
{
return false;
}
return res;
}
}