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

ГОСТ

Для защиты данных при их передаче между клиентом и сервером используется шифрование по ГОСТ 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.

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

// Преобразовать данные для передачи по защищенному каналу
var encodedDataToSign = JCWebClient().encode(utf8encodedData);
// Преобразовать подпись для передачи по защищенному каналу
var encodedSignatureData = JCWebClient().encode(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;
  },
});

Пример использования функции 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 = JCWebClient().decode(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);
}

Пример использования функции 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;
}

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.