Защитите WCF от скрипача (MITM) (PCL XAMARIN FORMS) - PullRequest
0 голосов
/ 25 января 2019

У меня есть проект форм xamarin с использованием переносимой библиотеки классов.В этом PCL я ссылаюсь на мою службу WCF, которая размещена на каком-либо сервере.

Привязка wcf - это Basichttpbinding с транспортом безопасности, поскольку PCL не поддерживает wshttpbinding.

Также wcf использует https и i.у меня есть действующий сертификат для этого.

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

Я думал, используя https, я защищал это.Я пытаюсь использовать wcf TransportWithMessageCredential, но мне не удалось войти в мой сервис, потому что xamarin еще не поддерживает эту комбинацию

Итак: (после исследования я выяснил, что)

  • PCL не поддерживаетwshttpbinding только basicHttpBinding
  • Xamarin.Forms basicHttpBinding не поддерживает безопасность сообщений, а только TransportCredentialOnly

И

  • Xamarin не поддерживает TransportWithMessageCredential, но только безопасность транспорта, но только транспортную безопасностьТранспортная безопасность не защищает данные от MITM.

Как другие работают с ксамарином и защищают эти данные?Я что-то пропустил?Какие-либо предложения?

EDITED


Я пытаюсь зашифровать xml-запрос перед отправкой в ​​службу, но происходит сбой каждый раз, когда я изменяю сообщение, например, сxml для закодированных символов (я полагаю, что серверу не удается распознать схему)

Я реализовал IClientMessageInspector на стороне клиента, а также IDispatchMessageInspector на стороне сервера.

Мне нужна помощь, как я могу отправить XML-запрос в зашифрованном виде на сервер ... если я сделаю это здесь, то смогу декодировать его со стороны службы (сервер)

На стороне клиента яиметь следующее

  Public Function BeforeSendRequest(ByRef request As Message, channel As IClientChannel) As Object Implements IClientMessageInspector.BeforeSendRequest

    Dim Binding As New BasicHttpBinding(BasicHttpSecurityMode.Transport)

    Dim ms As MemoryStream = New MemoryStream(System.Text.Encoding.UTF8.GetBytes(EncryptedData(request.ToString)))

    Dim RQuotas As Xml.XmlDictionaryReaderQuotas = Binding.ReaderQuotas

    Dim reader = Xml.XmlDictionaryReader.CreateTextReader(ms, RQuotas)
    request = Message.CreateMessage(reader, Int32.MaxValue, request.Version)


    Return Nothing

End Function

Я не уверен, правильно ли я это делаю.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 января 2019

Fiddler дешифрует трафик Https только в том случае, если вы принимаете его сертификат, он в основном действует как посредник и обрабатывает все вызовы от сервиса к вашему приложению, здесь есть некоторая полезная информация https://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/DecryptHTTPS,

Fiddler Https Decryption


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

Простой пример можно найти по адресу https://misaxionsoftware.wordpress.com/2011/07/29/secure-restful-web-service-by-wcf-web-api-no-https-seriously/

Вы можете настроить его как можно больше

Вот сообщение, которое определено в ссылке выше

Сообщение

public class Message
{
    public string AppId { get; set; }

    public string Data { get; set; }

    public string Id { get; set; }

    public string TimeStamp { get; set; }

    public byte[] GenerateFingerprint();

    public bool ValidateHash(byte[] fingerprint);
}

Зашифрованное сообщение

public class EncryptedMessage
{
    public string AppId { get; set; }

    public byte[] Fingerprint { get; set; }

    ///<summary>
    /// The 3DES key used to encrypt/decrypt the message 
    /// </summary>
    public byte[] Key { get; set; }

    ///<summary>
    /// Encrypted message
    /// </summary>
    public byte[] Message { get; set; }
}

IEncryptionHelper

public interface IEncryptionHelper
{
    EncryptedMessage Encrypt(Message message);

    Message Decrypt(EncryptedMessage encryptedMessage);
}
...