Защита данных при их передаче между клиентом и сервером

GOST

Для защиты данных при их передаче между клиентом и сервером используется шифрование по ГОСТ 28147-89. Используются секретные ключи, которые вырабатываются при выполнении протокола Handshake в рамках взаимной аутентификации (см. Взаимная аутентификация), а также параметры криптографических преобразований по ГОСТ 28147-89, соответствующие CipherSuite TLS_GOSTR341001_WITH_28147_CNT_IMIT согласно GOST 28147-89 Cipher Suites for Transport Layer Security (TLS).

Примечание

Все шифрование на стороне клиента осуществляется программно.

Для того чтобы реализовать шифрование данных по ГОСТ 28147-89 необходимо:

  1. Осуществить взаимную аутентификацию.
  2. Реализовать зашифровку/расшифровку данных
    • На стороне клиента:
      • Для зашифровки данных, направляемых клиентом серверу, используйте команду encode.
      • Для расшифровки данных, направляемых сервером клиенту, используйте команду decode.
    • На стороне сервера:
      • Реализуйте функцию расшифровки данных. В готовом примере Демобанк это реализовано через функцию decode в sslServer.dll.
      • Реализуйте функцию зашифровки данных. В готовом примере Демобанк это реализовано через функцию encode в sslServer.dll.

PRO

Для защиты данных при их передаче между клиентом и сервером используется шифрование 3DES или AES-128. Используются секретные ключи, которые вырабатываются при выполнении протокола Handshake в рамках взаимной аутентификации (см. Взаимная аутентификация), а также параметры криптографических преобразований согласно The Transport Layer Security (TLS) Protocol. Поддерживаемые CipherSuites:

  • TLS_RSA_WITH_3DES_EDE_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256

Примечание

Все шифрование на стороне клиента осуществляется программно.

Для того чтобы реализовать шифрование данных необходимо:

  1. Осуществить взаимную аутентификацию.
  2. Реализовать зашифровку/расшифровку данных
    • На стороне клиента:
      • Для зашифровки данных, направляемых клиентом серверу, используйте функцию encode.
      • Для расшифровки данных, направляемых сервером клиенту, используйте функцию decode.
    • На стороне сервера:
      • Реализуйте функцию расшифровки данных. В готовом примере Демобанк это реализовано через функцию decode в sslServer.dll.
      • Реализуйте функцию зашифровки данных. В готовом примере Демобанк это реализовано через функцию encode в sslServer.dll.

Использование команды encode

Пример использования команды encode на стороне клиента

// Преобразовать данные для передачи по защищенному каналу
var encodedDataToSign = JCWebClient2.encode( args: { data: utf8encodedData } );
// Преобразовать подпись для передачи по защищенному каналу
var encodedSignatureData = JCWebClient2.encode( args: { data: signature } );

// Данные для передачи на сервер
var sdata = {
   connectionID: connectionID,
   data: encodedDataToSign,
   signature: encodedSignatureData
};

// Сериализовать в JSON
var sdata = $.JSON.encode(sdata);

// Оправить данные на сервер
$.ajax({
   async: false,
   type: "POST",
   url: "WebService.asmx/uploadSignedData",
   data: sdata,
   contentType: "application/json; charset=utf-8",
   dataType: "json",
   success: function (msg) {
      ajaxError = false;
   },
   error: function (a, b, c) {
     ajaxError = true;
   },
});

Пример использования функции encode() на стороне сервера (C#)

[WebMethod()]
public byte[] getUploadedData(int connectionID,
                              int page,
                              int rows,
                              string sidx,
                              string sord)
{
  // Получить объект соединения по идентификатору соединения
  ConnectionState state = getConnection(connectionID);

  // Получить объект ssl сервера, созданный в методе loginBegin
  SSLServer server = state.server;

  // Проверить, аутентифицирован ли пользователь
  if (state.userLoggedIn == false)
  throw new System.Exception("User not logged in");

  // Создать объект сериализации в JSON
  JavaScriptSerializer js = new JavaScriptSerializer();

  // Сериализировать данные в строку JSON
  string serializedData = js.Serialize(data);

  // Перевести строку JSON в массив
  byte[] serializedDataArray = (
                   new System.Text.UTF8Encoding()).GetBytes(serializedData);

  // Получить данные для передачи клиенту
  byte[] retVal = server.encode(serializedDataArray);
  return retVal;
}

Использование команды decode

Пример использования команды decode на стороне клиента

// Оправить данные на сервер
$.ajax({
   async: false,
   type: "POST",
   url: "WebService.asmx/renewCert",
   data: data,
   contentType: "application/json; charset=utf-8",
   dataType: "json",
   success: function (msg) {
      serverRenewResponce = msg.d;
      ajaxError = false;
   },
   error: function (a, b, c) {
      alert(a + ";" + b + ";" + c);
      ajaxError = true;
   }
});

if (ajaxError == true) {
   throw "";
}

// Преобразовать данные из защищенного канала
serverRenewResponce = JCWebClient2.decode( args: { data: serverRenewResponce } );

Пример использования функции decode() на стороне сервера (C#)

[WebMethod()]
public void uploadData(int connectionID, byte[] data)
{
  // Получить объект соединения по идентификатору соединения
  ConnectionState state = getConnection(connectionID);

  // Получить объект ssl сервера, созданный в методе loginBegin
  SSLServer server = state.server;

  // Проверить, аутентифицирован ли пользователь
  if (state.userLoggedIn == false)

  throw new System.Exception("User not logged in");

  // Расшифровать данные с помощью криптографического компонента
  byte[] dataToSignD = server.decode(dataToSign);
}