Клиент-серверное шифрование данных и разработка протокола - PullRequest
0 голосов
/ 13 ноября 2009

Я пишу клиент-серверное приложение, которое будет использоваться в компьютерном классе и работать в качестве службы (без запуска в качестве службы). У меня есть консольное приложение, вызывающее нативную функцию «ShowWindow» / SW_HIDE с использованием консольного объекта HWND - это дает мне то, что я хочу здесь. Сервер / клиент работает, я отправил сообщение "Hello world!" с клиента на сервер много раз и мне приятно. (Я использую UDP для протокола сокетов, потому что ИТ-отделу нужен подход без установления соединения.)

Мой вопрос заключается в «протоколе» для связи между клиентом и сервером.

Цели, стоящие за сервером, включают следующее:

  • Предоставить программный доступ к некоторым возможностям, которые наш ИТ-отдел заблокировал для обеспечения безопасности (например, "net.exe")
  • Предоставьте доступ к моей программе, чтобы следить за тем, что студенты просматривают в компьютерной лаборатории.

Некоторые вещи, которые я хочу включить, - это простые вопросы, отправляемые туда и обратно:

  • Команда «REQUSER» вернет имя пользователя и полное имя (как ранее разрешалось «net user»)
  • Команда "REQPROCS" вернет список процессов, которые в данный момент выполняются под именем пользователя текущего пользователя.

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

Я думал о том, чтобы обеспечить схему шифрования для всех отправленных данных и декодировать их при получении.

Друг, с которым я говорил, сказал, что мне следует использовать упаковщик битов, и я начал переносить его класс BitPacker с C ++ на C #, с которым я запутался, и пришел сюда, чтобы посмотреть, что думает Stackoverflow.

namespace Atlantis.Net.Sockets
{
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Windows.Forms;

    public class UdpServer : System.Net.Sockets.UdpClient
    {

        #region Constructor(s)

        public UdpServer(Int32 port)
            : base(port)
        {
        }

        public UdpServer(IPEndPoint endPoint)
            : base(endPoint)
        {
        }

        #endregion

        #region Properties

        private Int32 m_Backlog = 32;
        /// <summary>
        ///     Sets how many active connections the socket can support
        /// </summary>
        public Int32 Backlog
        {
            private get
            {
                return m_Backlog;
            }
            set
            {
                m_Backlog = value;
            }
        }

        private Boolean m_IsInitialized = false;
        /// <summary>
        ///     Gets a value indicating whether the server has been initialized
        /// </summary>
        public Boolean IsInitialized
        {
            get
            {
                return m_IsInitialized;
            }
            private set
            {
                m_IsInitialized = value;
            }
        }

        private Int32 m_Port = 1337;
        /// <summary>
        ///     Sets the port number for listening for incoming connections
        /// </summary>
        public Int32 Port
        {
            private get
            {
                return m_Port;
            }
            set
            {
                m_Port = value;
            }
        }

        private Encoding m_Encoding = Encoding.ASCII;
        /// <summary>
        ///     Gets or sets the text encoding for data being transferred to/from the server
        /// </summary>
        public Encoding Encoding
        {
            get
            {
                return m_Encoding;
            }
            set
            {
                m_Encoding = value;
            }
        }

        #endregion

        #region Events

        public event EventHandler<UdpReceiveEventArgs> DataReceive;

        #endregion

        #region Methods

        protected virtual void OnDataRecieve(String data, object state)
        {
            if (DataReceive != null)
            {
                DataReceive(this, new UdpReceiveEventArgs(data, ((UdpState)state)));
            }
        }

        private void DataReceiveCallback(IAsyncResult ar)
        {
            UdpClient u = (UdpClient)((UdpState)ar.AsyncState).host;
            IPEndPoint e = (IPEndPoint)((UdpState)ar.AsyncState).endPoint;

            Byte[] data = u.EndReceive(ar, ref e);

            OnDataRecieve(Encoding.GetString(data), ((UdpState)ar.AsyncState));

            UdpState state = new UdpState();
            state.endPoint = new IPEndPoint(IPAddress.Any, Port);
            state.host = u;
            u.BeginReceive(new AsyncCallback(DataReceiveCallback), ((UdpState)ar.AsyncState));
        }

        /// <summary>
        ///     .
        /// </summary>
        public void Initialize()
        {
            if (IsInitialized)
            {
                return;
            }
            //Debug.WriteLine(String.Format("Local address and port : {0}", Client.RemoteEndPoint.ToString()));

            UdpState state = new UdpState();
            state.endPoint = new IPEndPoint(IPAddress.Any, Port);
            state.host = this;
            BeginReceive(new AsyncCallback(DataReceiveCallback), state);

            IsInitialized = true;
        }

        #endregion

    }
}

P.S. Надеюсь вопрос понятен? Я заметил, что большинство моих вопросов, которые я пишу, неясны. : /

1 Ответ

2 голосов
/ 14 ноября 2009

Класс SslStream из System.Net.Security может делать то, что вам нужно

(SslStream) Предоставляет поток, используемый для связь клиент-сервер, которая использует безопасность Secure Socket Layer (SSL) протокол для аутентификации сервера и, опционально, клиент.

...

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

подробности и примеры здесь: SslStream Class

...