zoukankan      html  css  js  c++  java
  • tcp/ip网络通讯安全加密方法

     tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等。但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的加密算法那就更加不可取;其实通过一些现有的加密的技术应用完全可以实现即简单又安全的网络通讯程序。首先保证网络通讯安全有两个方面,第一保证连接的有效性,其二就是保证内容即使被人拦截也难以从内容得到相关信息。

    连接有效性

    平常写网络程序在允许一个连接接入操作的时候,我们一般要对它进行一个有效性验证,如提供用户名密码或签名。

    签名:

    通过用户提供一分数据和数据相关签名信息,对方进行一个有效性验证。那这个数据和签名数据怎么做呢,其实现有加密技术中已经有一种描述提供了这种解决方案那就是RSA(非对称加密)。可以通过 RSA 的持有privatekey和publickey方进行一个数据签名,对方通过publickey进行一个验证.如果publickey和privatekey是配对的情况,那持有publickey就能验证成功,否则就会验证失败。在连接进行操作前可以通过这种方式进行处理,签名有效允许连接操作,无效的话可以直接把连接关闭。

    下面介绍通过c#如何实现这种签名:

    1
    2
    3
    4
    5
    6
    RasCrypto pri = new RasCrypto();
    RasCrypto pub = new RasCrypto();
    pub.PublicKey = pri.PublicKey;
    string name = "henry";
    string singdata = pri.Sign(name);
    Console.WriteLine(pub.Verify(name, singdata));

    RasCrypto是通过封装的类,源代码可以通过https://smarkdata.svn.codeplex.com/svn/Smark/Smark.Core/Smark.Core/RasCrypto.cs获取;在实际使用中最好是根据不同签名有不同的密对,这样即使某签名的密对被盗也不会影响其他用户的安全。

    用户名密码:

    基于用户名和密码验证是一种很常见的方式,但有个问题就是如何保证用户名和密码在通讯过程即使被截取了也难以得到用户名和密码呢?其实通过 RSA 也能够很好地解决这一问题。 RSA 提供public key加密而private key解密的方式,可以把public key提供给请求方就行了,private key保存在服务端;这样就可以保证加密的东西只有服务端才有解密,即使加密信息被其他人拦截也难以获取原有信息。

    下面介绍通过c#使用ras进行加解密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    RasCrypto server = new RasCrypto();
    RasCrypto client = new RasCrypto();
    client.PublicKey = server.PublicKey;
    string name = "henry";
    string pwd = "123456";
    string ename = client.Encrypt(name);
    string epwd = client.Encrypt(pwd);
    string dname = server.Decrypt(ename);
    string dpwd = server.Decrypt(epwd);
    Console.WriteLine("name:{0}", name);
    Console.WriteLine("pwd:{0}", pwd);
    Console.WriteLine("-----------------------------------------------------------");
    Console.WriteLine("ename:{0}", ename);
    Console.WriteLine("epwd:{0}", epwd);
    Console.WriteLine("-----------------------------------------------------------");
    Console.WriteLine("dname:{0}", dname);
    Console.WriteLine("dpwd:{0}", dpwd);
    Console.WriteLine("-----------------------------------------------------------");

     

    为了应用更安全,针对不同的连接生成不同的RSA密对,这样就能保证每个连接的各自安全性.

    信息加密

    前面提到的 RSA 可以进行数据加解密,其安全性也非常可靠;但有个缺点就是RSA对数据比多的时候加密比较慢,有些 RSA 加密的实现还有数据长度的限制。所以在很多情况下就要选择别的加密方式,这里介绍DES(对称加密)。不过对称加密有个缺点就是密对双方都必须一样,这样就会导致一个问题就从某一方获取密对就能对数据加密和解密工作。所以对称加的密对保护就显示非常重要的,这个工作可以交给 RSA 来做。

    以下是c#运用 RSA +DES的加解密方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    RasCrypto server = new RasCrypto();
     RasCrypto client = new RasCrypto();
     client.PublicKey = server.PublicKey;
     DESCrypto serverdes = new DESCrypto();
     DESCrypto clientdes = new DESCrypto();
     //获取没加密的key,iv
     DESCrypto.DESInfo info = clientdes.KeyInfo;
     Console.WriteLine("KEY: "+Smark.Core.Functions.ToString(info.Key));
     Console.WriteLine("IV: "+Smark.Core.Functions.ToString(info.IV));
     Console.WriteLine("");
     //设置相应的RSA信息
     serverdes.PrivateRas = server;
     clientdes.PublicRas = client;
     //获取了设置RSA信息的key,iv
     info = clientdes.KeyInfo;
     Console.WriteLine("KEY: " + Smark.Core.Functions.ToString(info.Key));
     Console.WriteLine("IV: " + Smark.Core.Functions.ToString(info.IV));
     //数据加密
     serverdes.KeyInfo = info;
     string value = "henryfan@msn.com", evalue = null, dvalue = null;
     evalue = serverdes.Encrypt(value);
     dvalue = clientdes.Decrypt(evalue);
     Console.WriteLine("VALUE: " + value);
     Console.WriteLine("EVALUE: " + evalue);
     Console.WriteLine("DVALUE: " + dvalue);
     Console.WriteLine("");
     evalue = clientdes.Encrypt(value);
     dvalue = serverdes.Decrypt(evalue);
     Console.WriteLine("VALUE: " + value);
     Console.WriteLine("EVALUE: " + evalue);
     Console.WriteLine("DVALUE: " + dvalue);
     Console.WriteLine("");
     Console.Read();

        通过RSA和DES就能够简单地实现可靠的网络通讯安全,不过有些朋友喜欢构建自己的加密方法,在这里并不见意这样做;因为自己构建的加密方法的可靠性并没有得到验证,并不像现有的加密方法经过长时候实践和大量的应用总结出来。

    相关资料:

    DES http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96 

    RSA http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95

    02 2012 档案

    tcp/ip网络通讯安全加密方法
    摘要: tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等。但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的加密算法那就更加不可取;其实通过一些现有的加密的技术应用完全可以实现即简单又安全的网络通讯程序。首先保证网络通讯安全有两个方面,第一保证连接的有效性,其二就是保证内容即使被人拦截也难以从内容得到相关信息。连接有效性平常写网络程序在允许一个连接接入操作的时候,我们一般要对它进行一个有效性验证,如提供用户名密码或签名。签名:通过用户提供一分数据和数据相关签名信息,对方进行一个有效性验证。那这个数据..阅读全文

    posted @ 2012-02-27 12:10 smark 阅读(1028) | 评论 (8) 编辑

    简单实现tcp/ip下的文件断点续传
    摘要: 其实在tcp/ip协议中传输文件可以保证传输的有效性,但有一个问题文件传了一部分连接意外断开了怎样;那这种情况只能在重新连接后继续传输,由于文件那部分已经传了那部分没有完成并不是tcp/ip的范围,所以需要自己来制定协议达到到这个目的。实现这个续传的协议制定其实也是非常简单,通过协议把文件按块来划分,每完成一个块就打上一个标记;即使是连接断了通过标记状态就知道还需要传那些内容。下面通过beetle来实现一个简单断点续传的程序(包括服务端和客户端)。 在实现之前先整理一下流程思路,首先提交一个发送请求信息包括(文件名,块大小,块的数量等),等对方确认后就进行文件块发送,对方接收块写入后...阅读全文

    posted @ 2012-02-24 10:29 smark 阅读(1474) | 评论 (3) 编辑

    使用Beetle简单构建聊天室程序
    摘要: 之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据;这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能。为了更好的描述所以通过创建一个聊天室程序来体现以上功能的易用性。 在实现功能之前先想好通讯上的协议需要什么功能,总结一下有:登陆,登陆成功返回,登陆和退出通过,获取现有其他用户和发送聊天信息等。需要的基础功能已经明确那就制定消息了. 通过Beetle处理消息对象必须实现IMessage接口,主要目的是由组件更好地管理buffer,避免重复的byte[]构建开销. public interface I...阅读全文

    posted @ 2012-02-22 10:10 smark 阅读(979) | 评论 (6) 编辑

    使用Beetle简单构建高性能Socket tcp应用
    摘要: beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列。除了队列上的支持组件还提供Buffer缓冲池和基于Buffer的DataWriter,DataReader对象,从而达到消息可以灵活地分布在多个Buffer中,实现更好的内存利率.为了使处理更高效组件使用多个SocketAsyncEventArgs对数据进行处理,可以同时进行接收和发送操作.经测试beetle可以在一些比较旧的电脑上(core e4300 1.8g)的电脑可以进行6W个以上的s...阅读全文

    posted @ 2012-02-21 20:33 smark 阅读(892) | 评论 (3) 编辑

    使用SocketAsyncEventArgs犯的低级错误
    摘要: 之前在使用SocketAsyncEventArgs进行数据接收的时候,经常发现某部分数据错乱但确没有影响协议分析。在无意中发现原来犯了个低级错误,先看下以下代码:public void IO_ReceiveComplete(TcpSocketAsyncEventArgs e) { TcpChannel channel = e.Channel; if (e.BytesTransferred > 0 && e.SocketError == System.Net.Sockets.SocketError.Success) ...阅读全文

    posted @ 2012-02-09 00:17 smark 阅读(65) | 评论 (0) 编辑

    C# Socket tcp 发送数据大小问题
    摘要: TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况测试内容描述: 每个文件块信息包大概是120k左右 采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K 测试服务器分别有: 局域网:ServerA 在美国机房:Server...阅读全文

    posted @ 2012-02-02 10:47 smark 阅读(2616) | 评论 (45) 编辑

  • 相关阅读:
    mysql实现主从备份
    Spring boot 继承 阿里 autoconfig 配置环境参数
    Spring Boot 注解的使用
    SpringBoot yml 配置
    浅谈提高工作效率
    Oracle 数据库特殊查询总结
    WPF MVVM 学习总结(一)
    VS2010部署Asp.net程序到本地IIS 7
    Asp.net MVC3表格共用分页功能
    WCF学习总结
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2371001.html
Copyright © 2011-2022 走看看