Защита данных при их передаче между клиентом и сервером
Токен GOST 2
Заголовок раздела «Токен 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 необходимо:
- Осуществить взаимную аутентификацию.
- Реализовать зашифровку/расшифровку данных
-
На стороне клиента:
-
Для зашифровки данных, направляемых клиентом серверу, используйте команду encode. - Для расшифровки данных, направляемых сервером клиенту, используйте команду decode.
-
На стороне сервера: - Реализуйте функцию расшифровки данных. В готовом примере Демобанк это реализовано через функцию
decodeвsslServer.dll. -
Реализуйте функцию зашифровки данных. В готовом примере Демобанк это реализовано через функцию
encodeвsslServer.dll.
Токен PKI
Заголовок раздела «Токен PKI»Для защиты данных при их передаче между клиентом и сервером используется шифрование 3DES или AES-128. Используются секретные ключи, которые вырабатываются при выполнении протокола Handshake в рамках взаимной аутентификации (см. Взаимная аутентификация), а также параметры криптографических преобразований согласно The Transport Layer Security (TLS) Protocol. Поддерживаемые CipherSuites:
TLS_RSA_WITH_3DES_EDE_CBC_SHATLS_RSA_WITH_AES_128_CBC_SHATLS_RSA_WITH_AES_256_CBC_SHATLS_RSA_WITH_AES_128_CBC_SHA256TLS_RSA_WITH_AES_256_CBC_SHA256
Для того чтобы реализовать шифрование данных необходимо:
- Осуществить взаимную аутентификацию.
- Реализовать зашифровку/расшифровку данных
-
На стороне клиента:
-
Для зашифровки данных, направляемых клиентом серверу, используйте функцию encode.
-
Для расшифровки данных, направляемых сервером клиенту, используйте функцию decode.
-
На стороне сервера:
-
Реализуйте функцию расшифровки данных. В готовом примере Демобанк это реализовано через функцию
decodeвsslServer.dll. -
Реализуйте функцию зашифровки данных. В готовом примере Демобанк это реализовано через функцию
encodeвsslServer.dll.
Использование команды encode
Заголовок раздела «Использование команды encode»Пример использования команды encode на стороне клиента
// Преобразовать данные для передачи по защищенному каналуvar encodedDataToSign = JCWebClient2.encode( args: { data: utf8encodedData } );// Преобразовать подпись для передачи по защищенному каналуvar encodedSignatureData = JCWebClient2.encode( args: { data: signature } );
// Данные для передачи на серверvar sdata = { connectionID: connectionID, data: encodedDataToSign, signature: encodedSignatureData};
// Сериализовать в JSONvar 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»Пример использования команды 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);}
