7.9.1 Токен GOST 2

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

7.9.2 Токен PKI

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

7.9.3 Использование команды 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;
}

7.9.4 Использование команды 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);
}