客户机-服务器的数据加密和协议的设计
-
20-09-2019 - |
题
我写客户机-服务器应用程序,用于在一个计算机实验室和作为一个服务(没有运行作为一个服务)。我有一个控制台应用程序调的机函数"ShowWindow"/SW_HIDE使用控制台的HWND对象--这给它什么我想要在这里。服务器/客户的工作,我已经发送的信息"hello world!"从客户向服务器多次我感到高兴。(我采用UDP套接字协议,因为它部门想要一个无连接的方法。)
我的问题就在于一个'议定书'之间的通信的客户机-服务器。
在目标后面的服务包括如下:
- 给访问,以编程方式,以一定的能力,我们的IT部门阻止出于安全(例如"net.exe")
- 给访问我的程序来监测学生观看在计算机实验室。
有些事情我想要包括是简单的问题被发回:
- 一个命令的"REQUSER"会回来的用户名和姓名(如允许通过"网用户"之前)
- 一个命令的"REQPROCS"将返回的列表进程目前正在跑在前用户的用户名。
我毫不怀疑我能够做到这一点。这件事我leary的是数据安全性。我们有一些"黑客"在这里,在我上大学的人可能知道如何分组嗅和能够重新发送的报文出具体的服务器要么恶意事物或得到信息上的敌人或诸如此类的东西。
我想到的是提供一个加密方案上的所有发送的数据和对它进行解码月收到。
一个朋友我跟我说我应该用一点打包机和我开始移植他BitPacker类从C++C#我得到了混淆,并来到这里看到什么计算器的想法。
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.我希望这个问题是清楚了吗?我注意到我的大多数问题,我写的是目前还不清楚。:/
解决方案
SslStream类系统。网。安全可能做你需要什么
(SslStream)提供了一流的用于 客户机-服务器使用的通信 安全插口层(SSL)安全 协议进行认证的服务器 和任选的客户。
...
SSL协议有助于提供 保密性和完整性检查 消息发送的使用 SslStream.SSL连接,例如 所提供的SslStream,应 通信时使用敏感 之间的信息的一个客户和一个 服务器。使用SslStream帮助 防止任何人阅读和 篡改信息的话这是 在过境国网络上的
更多的细节和实例: SslStream类