Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » .NET - Все статьи »

Обсудить на форуме Обсудить на форуме

К вопросу построения прототипа защищенных информационных систем.
Основные цели построения прототипа – (1) научиться строить много проектные решения (много файловые сборки) в среде Visual Studio/C# (приложения, состоящие из одного .exe и нескольких .dll); (2) научиться строить программные системы на основе нескольких взаимодействующих программных приложений, взаимодействующих как в среде отдельного компьютера, так и в рамках сети; (3) научиться удаленно работать с конфиденциальной информацией SQL сервера, используя в качестве транспорта данных Интернет или нез
Основные цели построения прототипа - (1) научиться строить много проектные решения (много файловые сборки) в среде Visual Studio/C# (приложения, состоящие из одного .exe и нескольких .dll); (2) научиться строить программные системы на основе нескольких взаимодействующих программных приложений, взаимодействующих как в среде отдельного компьютера, так и в рамках сети; (3) научиться удаленно работать с конфиденциальной информацией SQL сервера, используя в качестве транспорта данных Интернет или незащищенный сегмент локальной сети, (4) определить и осуществить реализацию минимального состава необходимых методов хеширования, сериализации типов, компрессии и шифрования передаваемой информации.

В процессе построения прототипа решены следующие задачи:

  • идентификация пользователя, инициирующего обмен;
  • авторизация пользователя в процессе работы;
  • ограничение доступа к функциям и записям таблиц базы данных информационной системы (управление доступом);
  • защита трафика;
  • компрессия информации;
  • производительность информационной системы;
  • осуществлена реализация необходимых программных методов;
  • построено много проектное решение для пользовательского интерфейса,
  • построена программная система, состоящая из трёх взаимодействующих приложений на основе .Net Remoting,
  • разработан и реализован общий подход к настройке WEB-, .NET- сервисов и Windows приложений.

 

Построенный прототип представляет собой распределённую систему управления централизованным каталогом видео фильмов. Самостоятельно может работать в студенческих общежитиях или локальной сети квартала. Как прототип может служить базой для построения распределённых информационных систем в банковском деле (удаленный АРМ операционного дня, АРМ клиента банка), построения общегородских распределённых информационных систем по наличию лекарств в аптеках, построения информационных систем супермаркетов, товарных складов и т.п.

Идентификация пользователя и построение сессии.

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

Структура учетной записи

 

N/N Name Data Type Size
1 GUID Uniqueidentifier 16
2 Имя nvarchar 64
3 hshLogin Binary 20
4 hshPassword Binary 20
5 Cmd Int 4
6 hshPinCod Binary 20

3, 4 и 6 поле строки содержат hash представления Login, Password и PinCod-а пользователя.
5 поле (cmd) содержит битовый вектор доступа к функциям и объектам системы.

Учетные записи предопределённых пользователей защищенной информационной системы - Администратора и Гостя, генерируются при первоначальном запуске Windows .Net приложения "КриптоСистема" на любом из КриптоСерверов. Учетные записи других пользователей создаются Администратором.

Администратор системы, используя Windows.Net приложение "RSAKeyPairGen", генерирует также и ключевую пару ассимметричного криптографического алгоритма. Открытый ключ, вместе с клиентским Windows.Net приложением "wсКаталогВидео", передается пользователю.

Предопределённые пользователи могут получить доступ к данным или как Гость, с минимальными возможностями (только просмотр имеющихся в наличии фильмов), или как Администратор, с почти неограниченными возможностями, но для этого ему надо знать Login и Password. Гость и Администратор не имеют PinCod-а. Кроме группы предопределённых пользователей существует группа пользователей, являющихся владельцами фильмов. Для своего фильма владелец может редактировать все параметры. Для совместного фильма - только ограниченное число своих параметров.

Запуская клиентское приложение на своей рабочей станции, пользователь любой группы попадает в состояние регистрации. Его вежливо просят ввести Login и Password или PinCod. Я не знаю, как бороться с "закладкой", перехватывающей нажатие клавиш. Поэтому разработал два варианта ввода параметров идентификации пользователя.

Вариант 1: пользователь вводит Login и Password. По нажатию кнопки "Регистрация" программа генерирует код сессии, ключ и initialization vector (IV) симметричного алгоритма шифрования. Для Login и Password строятся их hash представления, которые шифруются симметричным ключом, симметричный ключ шифруется открытым ключом ассимметричного алгоритма.

Вариант 2: пользователь вводит PinCod. По нажатию кнопки "Регистрация" программа строит hash представление PinCod-а и делает запрос КриптоСерверу на предмет наличия зарегистрированного пользователя с таким PinCod-ом. Если сервер подтверждает наличие, то программа считывает hash представления Login и Password из файла hshLP.bin. Далее аналогично первому варианту. Файл hshLP.bin располагается в предопределенном месте - или на съемном носителе (дискета, cd, флеш) или крипто защищённом личном разделе жесткого диска.

Байтовая последовательность информационного запроса = [ключ сессии] + [IV симметричного шифрования] + [код функциональной группы=0x00] + [индекс команды в группе=0x0001] + [ассимметрично зашифрованный симметричный ключ] + [симметрично зашифрованный hash Login] + [симметрично зашифрованный hash Password], отправляется через Интернет (сегмент) Web (Remote) серверу защищённой информационной системы с Web сервисом "webSevice_KatalogVideo" на IIS (Remote.Net сервисом "RemoteServiceOnIIS" на IIS или Remote.Net сервисом "rService_KatalogVideo_Lib" на сервере "crService_KatalogVideo").

Web (Remote) сервис получает байтовую последовательность запроса, проводит её частичный анализ, записывает результат анализа в таблицу запросов SQL-сервера запросов/ответов и переходит в состояние ожидания ответа (ответом может быть и код ошибки).

Структура записи таблиц запросов/ответов (SQL сервер)

 

N/N Name Data Type Size Примечание
1 GUID uniqueidentifier 16 Код сессии
2 lnInfo Int 4 Длина байтовой последовательности запроса
3 Info Image 16 Байтовая последовательность запроса
4 dt datetime 8 Time-out (только для таблицы ответов)

В текущей версии системы для хранения запросов/ответов вместо SQL-сервера применяется Remote .Net сервер, реализованный в форме консольного приложения.

Remote .Net сервер хранит информацию о запросах/ответах в следующих структурах:

byte[] bvСессия - (0-свободно, 1-запрос, 2-запрос обрабатывается, 3-ответ)

Guid[] gdСессия - компонента хранит Guid сессии

object[] aoЗапросОтвет - компонента хранит сериализованное представление запроса/ответа

DateTime[] dtСессия - компонента хранит максимально допустимое время обработки запроса

Взаимодействие Remote .Net сервера с другими приложениями реализовано на основе интерфейсов им представляемых

 

public interface IКлиент
{
  short	ЗаписьЗапросаКлиента(byte[] bv);
  byte[]	ЧтениеОтветаКлиентом(byte[] ab);
}
public interface IКриптоСервер
{
  byte[]	ЧтениеЗапросаКриптоСервером();
  byte[]	ЗаписьОтветаКриптоСервером(byte[] bv);
}
public interface ITimeOut
{
  void	TimeOut();
}

Никаких крипто преобразований Web (Remote) сервис не производит. Web (Remote) сервис создаёт канал в Интернете (сегменте локальной подсети), по которому передаётся шифрованная информация.

Каждый КриптоСервер постоянно сканирует таблицу запросов (обращается к Remote .Net серверу) и при получении запроса переходит к его детальному анализу. Если запрос может быть обработан данным КриптоСервером, то запись запроса стирается из таблицы запросов (изменяется байт bvСессия[i]) и анализ продолжается, иначе работа над запросом завершается без уничтожения записи.

Группа функций с кодом 0x00 отвечает за регистрацию клиента.

Если пользователь с данными Login и Password создан (имеется соответствующая запись в таблице Владельцы информационного SQL сервера), то генерируется запись в таблицу сессий информационного SQL сервера и запись в таблицу ответа SQL сервера запросов/ответов (запись в структуры Remote .Net сервера) и КриптоСервер переходит в состояние сканирования таблицы запросов SQL сервера запросов/ответов (сканирования вектора bvСессия Remote .Net сервера).

Структура записи таблицы сессий

 

N/N Name Data Type Size Примечание
1 gdСессия uniqueidentifier 16 Код (guid) сессии
2 gdКлиент uniqueidentifier 16 Код (guid) клиента (владельца), связь с таблицей Владельцы
3 dtСессия datetime 8 Time-out
4 tdsKey binary 24 Ключ симметричного шифрования
5 cmd int 4 Битовый вектор доступа
6 ivKey binary 8 IV симметричного алгоритма шифрования
7 strЗапрос ntext 16 Храним SELECT запроса фильмов
8 hs uniqueidentifier 16 Храним сериализованный список Guid

Web (Remote) сервис находит по коду сессии свою запись в таблице ответов (в векторе aoЗапросОтвет) и отправляет ответную байтовую последовательность через Интернет (сегмент локальной подсети) клиенту. Запись из таблицы ответов удаляется (модифицируется компонента bvСессия) и Web (Remote) сервис прекращает своё существование.

Структура байтовой последовательности ответа в случае регистрации клиента
Ошибка - [двухбайтовый код ошибки]
Штатно - [0x00,0x00] + [IV ответа] +[симметрично зашифрованное Info]

Структура Info ответа для регистрации:
[cmd клиента]+[guid клиента]+[размер страницы]+[имя клиента]

Структура байтовой последовательности для общего случая информационного запроса/ответа: Запрос:
[guid Сессии] + [IV запроса] + [индекс группы команд] + [симметрично зашифрованное Info]

Структура Info запроса:
[индекс команды в группе] + [параметры команды]

Структура ответа:
Ошибка - [двухбайтовый код ошибки]
Штатно - [0x00,0x00] + [IV ответа] + [симметрично зашифрованное Info ответа]

 

В общем случае Info ответа содержит результирующий набор данных в виде строк отсортированной таблицы. Размер таблицы может превышать допустимые границы, например, в случае запроса показать все фильмы. Для работы с подобными наборами данных используем страницы. Идея проста - результирующий набор данных делится на страницы и за единичный акт обмена на рабочую станцию пользователя передаётся одна страница отсортированной таблицы. С целью уменьшения трафика предложение SELECT для построения страничного набора данных и его параметры передаются по сети единожды и хранятся в полях строки таблицы Сессий (strЗапрос, hs). Для получения следующей страницы достаточно пересылки её номера. Размер страницы в записях - параметр настройки КриптоСервера. Привожу фрагмент программы получения страницы:

try{
  dsКриптоСистема.Фильмы.Clear();
  sdaФильмы.Fill(dsКриптоСистема,npf*rpf,rpf,"Фильмы");
  dsКриптоСистема.Фильмы.AcceptChanges();
}
catch{
  dsКриптоСистема.Фильмы.Clear();
  xbb=new byte[2]{4,1};	//-- Ошибка чтения строк фильмов
  return false;
}

Где: npf - номер страницы, rpf - размер страницы в записях

В процессе формирования ответа страница обрабатывается Zip компрессором данных. Привожу фрагмент программы сериализации и компрессии страницы:

//-- Построим вектор строк из таблицы результата
int max=dsКриптоСистема.Фильмы.Count;
object[]objArray=new Object[max];
//-- objArray Я страница
for(int i=0;i<max;i++) objArray[i]=dsКриптоСистема.Фильмы.Rows[i].ItemArray;
//-- Сериализация и компрессия
if(!binSerObject(objArray)) {. . .} //-- сериализация
if(!Компрессор())  {. . . }         //-- компрессия

Авторизация пользователя при дальнейших запросах производится по коду сессии и параметрам симметричного алгоритма шифрования (ключу и IV шифра).

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

Защита трафика осуществляется путем шифрования симметричным ключом сессии передаваемой байтовой последовательности.

Для защиты передачи симметричного ключа сессии используется открытый ключ

Производительность информационной системы регулируется изменением числа "КриптоСерверов". Дополнительный способ повышения производительности системы реализован в текущей версии системы. Здесь для хранения запросов/ответов применяется не SQL сервер, а Remote .Net сервер "rServer_УпрвалениеЗапросОтвет". Попытка кардинально повысить производительность системы за счет ручной сериализации результирующего набора строк таблицы фильмов оказалась не состоятельной. Внутренние методы сериализации .Net Framework работают прекрасно и разумно пользоваться именно ими.

Реализация программных методов хеширования, сериализации типов, компрессии информации и шифрования

//-- Переменные уровня класса	
byte[] xbb;
MemoryStream xms;
byte[] TDESKey=byte[24];
byte[] TDESIV=byte[8];
int xbbN;

//-- =================
//-- == Хеширование ==
//-- =================
//-- Формируем hash код строки
//====================================
private byte[] hКод(string s)
{
  UnicodeEncoding UE = new UnicodeEncoding();
  //-- Преобразование строки в вектор байтов.
  byte[] bv = UE.GetBytes(s);
  //-- Создадим объект SHA1Managed для формирования hash значения.
  SHA1Managed SHhash = new SHA1Managed();
  //-- Построим hash значение для байтового вектора.
  return SHhash.ComputeHash(bv);
}
 
//-- ========================
//-- == Сериализация типов ==
//-- ========================

//-- Бинарная сериализация известного объекта 
//-- В нашем случае зто вектор строк результирующего набора данных
//-- xms <-- байтовое представление объекта
//=========================================================
private bool binSerObject(object obj)
{
  try	{
    xms=new MemoryStream();
    BinaryFormatter binForm=new BinaryFormatter();
    binForm.Serialize(xms,obj,null);
    xms.Position=0;
    return true;
  }
  catch {return false;}
}
//-- Бинарная десериализация известного объекта из памяти
//-- xms <-- байтовое представление объекта
//=========================================================
private object binDeSerObject()
{
  try	{
    BinaryFormatter binForm=new BinaryFormatter();
    return binForm.Deserialize(xms,null);
  }
  catch {return null;}
}
//-- Формируем 4-х байтовое представление int
//-- ii Я целое
//-- k  Я индекс в xbb 
//-- xbb Я целое
//=================================================
private void IntToXBB(int ii,int k)
{
  byte[] bt=BitConverter.GetBytes(ii);
  bt.CopyTo(xbb,k);
}
//-- Формируем 4-х байтовое представление int
//-- xms Я целое
//=================================================
private void IntToXms(int ii)
{
  byte[] bt=BitConverter.GetBytes(ii);
  xms.Write(bt,0,bt.Length);
}
//------------ Восстановление int ------------
//-- int Я байтовое представление xbb
//==========================================================
private int XBBToInt()
{return BitConverter.ToInt32(xbb,0);}
//------------ Восстановление int ------------
//-- int Я байтовое представление xms
//==========================================================
private int xmsToInt()
{
  byte[]bt=new Byte[4];
  xms.Read(bt,0,4);
  return BitConverter.ToInt32(bt,0);
}
 
//-- Формируем 8-и байтовое представление long
//-- xms Я long
//=================================================
private void LongToXms(long ii)
{
  byte[] bt=BitConverter.GetBytes(ii);
  xms.Write(bt,0,bt.Length);
}
//------------ Восстановление long ------------
//-- long Я xms(байтовое представление long)
//==========================================================
private long xmsToLong()
{
  byte[]bt=new Byte[8];
  xms.Read(bt,0,8);
  return BitConverter.ToInt64(bt,0);
}
//-- Формируем 8-и байтовое представление DateTime в xms
//-- xms Я DateTime
//========================================================
private static void DateTimeToXMS(DateTime dt)
{
  LongToXMS(dt.Ticks);
}
//-- Восстановление DateTime из xms
//-- DateTime Я xms
//==========================================================
private static DateTime xmsToDateTime()
{
  long n=xmsToLong();
  return new DateTime(n); //-- DateTime <--  long
}

//-- Работа с байтовым представлением строкового типа
//-- s - Строковый тип; bt - байтовое представление
//==========================================================
byte[]bt=UnicodeEncoding.UTF8.GetBytes(s);   //-- byte[] Я s
string s=UnicodeEncoding.UTF8.GetString(bt); //-- s Я byte[]


//-- ===========================
//-- == Компрессия информации ==
//-- ===========================

//-- Компресор 
//-- вход:  xbb (вектор для компресии)
//-- выход: xbb (длина исходного(4)+сжатый вектор)
//=========================================================
private bool Компрессор()
{
  if(xbb.Length==0) return true;
  byte[]bb;
  try	{
    bb=ZipBase.Compress(xbb);
    int m=xbb.Length;
    xbb=new byte[4+bb.Length];
    IntToXBB(m,0);
    bb.CopyTo(xbb,4);
    return true;
  }
  catch {return false;}
}
 
//-- Декомпрессор 
//-- вход:
//-- фрагмент xms содержит компресированный байтовый вектор,
//-- указатель стоит на начале фрагмента
//-- выход;
//-- xms	<-- декомпресированное Info
//===============================================================================
private bool Декомпрессор()
{
  byte[] bb=new byte[((int)xms.Length)-4];
  try
  {
    int n=xmsToInt();	      //-- длина исходного Info
    byte[] bb1=new byte[n];	//-- место для декомпрессированного Info
    xms.Read(bb,0,bb.Length);	//-- bb <-- компрессированное Info
    ZipBase.Uncompress(bb1,bb);
    xms.Close();
    xms=new MemoryStream(bb1,0,bb1.Length);
    return true;
  }
  catch
  {
    xms.Close();
    return false;
  }
}

//-- ================
//-- == Шифрование ==
//-- ================

//-- TDES крипто 
//-- вход:  xbb (вектор для шифрования)
//-- выход: xbb (шифрованный вектор)
//=========================================================
private bool TDESEncrypt()
{
  if(xbb.Length==0) return true;
  CryptoStream cs=null;
  MemoryStream ms=null;
  try	{
    byte[]bb=new Byte[32];
    byte[]key=new byte[24];
    byte[]iv=new byte[8];
    new RNGCryptoServiceProvider().GetBytes(bb);	
    //-- байтовый вектор bb содержит хорошо рандомизированную величину
    for(int i=0;i<8;i++) TDESIV[i]=bb[i];
    TDESKey.CopyTo(key,0);
    TDESIV.CopyTo(iv,0);
    ms=new MemoryStream();
    cs=new CryptoStream(ms,tdes.CreateEncryptor(key,iv),CryptoStreamMode.Write);
    cs.Write(xbb,0,xbb.Length);
    cs.FlushFinalBlock();
    xbb=ms.ToArray();
    cs.Close();
    ms.Close();
    return true;
  }
  catch {
    if(cs!=null) cs.Close();
    if(ms!=null) ms.Close();
    return false;
  }
}
 
//-- TDES декрипто 
//-- фрагмент MemoryStream xms содержит шифрованную байтовую последовательность,
//-- указатель стоит на начале фрагмента
//-- ln <-- длина фрагмента 
//===============================================================================
private bool TDESDecrypt(int ln)
{
  CryptoStream cs=null;
  try	{
    byte[]key=new Byte[24];
    byte[]iv=new Byte[8];
    TDESKey.CopyTo(key,0);
    TDESIV.CopyTo(iv,0);
    cs=new CryptoStream(xms,tdes.CreateDecryptor(key,iv),CryptoStreamMode.Read);
    xbbN=(int)cs.Read(xbb,0,ln);
    cs.Close();
    return true;
  }
  catch {
    if(cs!=null) cs.Close();
    return false;
  }
}

В качестве Web сервера используется IIS, с максимально отключенными возможностями.
В качестве Remote .Net сервера используется консольное приложение.
В качестве ассимметричного алгоритма шифрования используется 1024 битный RSA, в качестве симметричного - TrippleDES.

Web (Remote) сервис ни под каким предлогом не сможет войти во внутреннюю локальную сеть и получить доступ к КриптоСерверам и данным информационного SQL сервера!!!!

Все приложения системы (клиентские, Web сервис, Remote сервис под Web сервер, Remote сервис под Remote сервер, КриптоСервер и RSAKeyPairGen) написаны на C#. Клиентские Windows.Net приложения написаны в формате много проектного решения (много файловой сборки). Их всего два:

  1. для работы с Web сервисом на IIS сервере,
  2. для работы с Remote .Net сервисом на IIS сервере или с Remote .Net сервисом на Remote .Net сервере.

Предложенный подход к построению информационной системы, основанный на применении Web (Remote) сервисов, можно сравнить с подходом, основанным на применении Web приложения ("webSQL:_KatalogVideo") и Internet Explorer (только сравнить - их функциональность далеко не тождественна).

Если есть интерес, исходные решения того и другого подхода можно забрать с сервера …………..(т.е. у того, кто согласится их разместить).

Что должно быть в промышленной версии, но отсутствует в прототипе:

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

Графический интерфейс пользователя для работы с данными, как в Интернете, так и локальной сети абсолютно идентичен и реализован в двух приложениях - для работы с Web сервисом на IIS и работы с Remote .Net. сервисами на IIS и RemoteServer-е. Для варианта работы с Remote .Net сервисами выбор канала обмена (Tcp или Http) задается в файле "НастройкаWebRemoteServiceКлиента.txt" настройки приложения. Разница в работе ощущается лишь по длительности операции загрузки страницы данных с информационного SQL сервера в локальную базу данных.

Внешний вид панелей графического интерфейса пользователя

 

 

Клиентское приложение построено в форме много проектного Visual Studio (VS-) решения, основу которого составляют три проекта - clsApp, dbДоступ и wcКаталогВидео.

Первый проект - clsApp, реализует построение класса общих (глобальных) параметров решения, включая описание и определение делегатов общих функций всего проекта. Он не ссылается ни на один другой проект решения, но на него могут ссылаться все. Иными словами, его видят все, он не видит никого. В последовательности компиляции проект clsApp стоит первым номером. Особенностью данного класса является определение здесь общих параметров как статических переменных:

  static public dgtРегистрацияПользователя	РегистрацияПользователя=null;
  static public dgtАнализPinCod			АнализPinCod=null;

Второй проект - dbДоступ, содержит реализацию локальной базы данных. В последовательности компиляции он стоит вторым номером.

Третий проект - wcКаталогВидео, содержит ссылки на все другие проекты решения. Он видит всех, его не видит никто. В последовательности компиляции он последний. Содержит описание единого окна решения и реализацию общих функций пользовательского интерфейса.

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

Также, для построения VS-решений применяется внешняя Zlib.dll, реализующая функциональность компрессора данных.

Общий подход к настройке .Net сервисов и приложений

Файлы "app.config" и "Web.config" содержат дополнительный фрагмент

 

<appSettings>
  …..
  <add key="pathSetting" value="XXX"/>
</appSettings>

XXX - или пусто "", или полный путь к папке с дополнительным файлом настройки, например C:\НастройкаWebRemoteServiceКлиента\

Доступ к фрагменту:

string ss=System.Configuration.ConfigurationSettings.AppSettings["pathSetting"];

Доступ к дополнительному файлу настройки:

ss+="НастройкаWebRemoteServiceКлиента.txt";
  StreamReader sr= new StreamReader(ss,System.Text.Encoding.Default,true);

Анализ файла настройки

//-- Анализ протокола - Tcp или Http
HostUrl = rp(s);
if(HostUrl.IndexOf("tcp",0,3)<0)
{//-- Запуск RemoteService на WebServer
  HostUrl+=@"RemoteServiceOnWebServer/RemoteServiceOnIIS_Uri.soap";
  fServer=false;
}
else
{//-- Запуск RemoteService на RemoteServer
  HostUrl+=@"RemoteServer/rServer_KatalogVideo_Uri";
  fServer=true;
}

и т.д. ...

Содержимое файла настройки "НастройкаWebRemoteServiceКлиента.txt":

//--Настройка WebService клиента и Remote Service клиента
//--==================================================
//-- фрагмент Url для Remote сервера или Web сервера 
http://localhost:80/  //-- Фрагменты   tcp://localhost:5000/ (Remote)  http://localhost:80/(Web)
//--
//--Path доступ к каталогу файла HTML
C:\ НастройкаWebRemoteServiceКлиента
//--Path доступ к каталогу файла Crystal Report
C:\ НастройкаWebRemoteServiceКлиента
//--Path доступ к каталогу файла hshLP.bin
//-- этот каталог должен располагаться на личном носителе!!!
//-- (например - флоппи или в Cripto-папке личного profile), 
!!! 	//--если "!!!", то hshLP.bin располагается в ["APPDATA"]+"\MyCrypto\" пользователя

Анализ дополнительного файла настройки

//-- Чтение параметра из файла настройки
private string rp(StreamReader sr)
{
  string x,y,z;
  int n,i;
  //-- Пропуск строк комментария
  do {
    x=sr.ReadLine(); //-- Читаем строку файла настройки
    if(x.Length<4) x+="   ";
  }			
  while(x.Substring(0,4)==@"//--");
  //-- Анализ строки
  n=x.IndexOf(@"//--",0,x.Length);	//-- Отбросим комментарии в конце строки,
                                   //-- если они есть
  n=(n<0)?x.Length:n;
  y=x.Substring(0,n);
  x="";
  z="";
  //-- отбрасываем символы управления, такие как "TAB" 
  for(i=0;i<n;i++) {
    if(char.IsControl(y,i)){z=" ";}
    else {
      x=x+z+y.Substring(i,1);
	z="";
    }
  }
  return x.Trim();
}

Аннотация

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


Может пригодится:


Автор: Владимир
Прочитано: 2834
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру