热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络安全(1)-身份认证

网络数据安全现在在网络上两个节点A和B之间进行通信的时候,数据包经过的路径上很有可能会有很多的路由节点。在这些中间路由节点上,A和B之间的IP包是完全可以被截获、修改、甚至丢弃的,因此在网

网络数据安全

    现在在网络上两个节点A和B之间进行通信的时候,数据包经过的路径上很有可能会有很多的路由节点。在这些中间路由节点上,A和B之间的IP包是完全可以被截获、修改、甚至丢弃的,因此在网络上的数据传输并不安全,或者说基本的网络7层协议并不确保数据传输的安全性。 
    数据的安全传输对用户来说意义重大,显然,没有用户愿意忍受自己所发送的每一段消息、传输的每一份文件都有可能被另外一个不相干的人偷窥。因此,在不安全的网络上构建安全的通信非常重要。 
    要在网络上进行数据的安全传输,主要需要实现两个方面: 
(1)身份认证,用于确定你数据的来源是你预想的。 
(2)数据加解密,用于对传输的数据进行加解密。 
(3)数据完整性校验,用于防止数据被篡改。

身份认证

    身份认证是对数据的来源进行确认,比如用户A和用户B通过网络传输数据,他们都希望自己收到的数据是来自B和A,而不是由其他人伪造的;某机构发布了一个文件,用户A从网上下载了该文件,他希望该文件确实是由该机构发布的,这些都可以通过身份认证来得到保证。 
    现在常用的身份认证方法是使用证书。 
1、证书使用 
    证书就是一个公私钥对中的公钥(公私钥在后续RSA中会具体讲),公私钥是非对称加解密的实现方式,公钥加密的数据,只有对应的私钥才能解密,反之亦然。 
如果某机构申请了一张属于自己的证书,然后向互联网用户公开该证书,用户如果接受,则将证书存在电脑中。之后该机构在发布数据的时候,带上签名,签名可以是一个明文字符串X+经过该机构私钥对X加密后的结果Y。当用户收到数据之后,通过该机构公开的证书(公钥)对签名中的Y进行解密得到Z,如果此时Z和X相等,则可以判定该数据确实是由该机构发布的。<私钥加密,公钥解密>

2、证书申请/颁发 
    颁发证书crt,颁发证书当然不是谁想干就能干的,这得有专门的证书颁发机构来执行这项权利。CA(Certificate Authority,证书授权中心)是负责管理和签发证书的机构的第三方机构,一般是权威可信的、经过国家认证的部门。 
    如果某机构或网站想要一个证书用于向用户证明自己的身份,它首先要想CA申请,CA如果同意申请,会签发一张证书给该机构。此时该机构或网站有了证书,它向网络用户公开的时候,怎么让人们相信这张证书确实是CA颁发的而不是自己伪造的呢?首先,CA是权威机构,它自己也有证书,且证书一般都会被用户接受存放在电脑中;然后,CA在证书的末尾会添加一段签名(和上面的X加密得到Y一个道理),用户在收到新颁发的证书之后会通过自己电脑中存放的CA机构的证书去解密从而可以校验该证书是否是CA颁发。

3、证书层级与信任链 
    证书是分层级的,每份证书(除了根证书)都会指定其上级CA(颁发该证书的CA)的名字,系统根据名字定位到系统中的CA证书;其上级CA的证书也会指定其对应的再上一级CA的名字.....直到根证书,根证书是不需要证明的。 
-windows系统自带了一些CA证书,大部分是美国的CA颁发,中国用户应该先安装一个工信部的根证书,该证书应该是美国的CA签发,国内的其他机构再向工信部申请证书。 
    根证书一定是可信的,这是证书安全体系的根本。根证书信任的那些证书也应该是安全的,根证书信任的那些证书信任的证书也应该是安全的,这样一级一级往下传.... 如果中间有证书不遵守规则,信任了不安全的证书,那么后续的证书链均有可能不安全......比如前段时间支付宝偷偷在用户的电脑里添加根证书,这种行为私自修改的信任链规则,添加的根证书可能会信任一些不安全的证书,从而给系统带来隐患。

使用证书进行身份认证

使用公开的证书

    https协议中,浏览器就是通过证书来验证服务器是否合法的。 
    服务器首先会向CA申请证书(如果没有向CA申请,则在访问的时候浏览器会提示用户是否信任该服务器提供的证书);浏览器在访问https服务器的时候,https服务器最开始就将自己的证书发送给浏览器,如果服务器的证书是向CA申请过的,浏览器可以通过本地机器上CA的证书对服务器的证书进行确认(通过CA的公钥进行解密,判断签名是否一致);如果服务器的证书没有向CA申请过,则浏览器会发出警告,此时可以将该证书添加到“受信任的根证书颁发机构”存储区,就不会再收到安全提示了(当然要确定该网站确实没有问题)。 
    确认了证书没有问题之后,我们怎么确定证书确实是由服务器发送过来的,而不是另外一个网站提前获得了证书,然后再发给浏览器的呢?(如果是那样,则说明浏览器建立连接的对象搞错了。之后即使浏览器进行对称加密的密钥不会被假冒的服务器获得,因为浏览器会用正确网站的证书公钥加密,而只有拥有私钥的正确的网站才能够解密,但是至少浏览器无法正常的通信...) 
    可以这样,浏览器先随机生成一个字符串,然后传送给服务器,服务器用私钥加密,并将加密之后的结果返回给浏览器,浏览器用公钥解密,查看是否是之前随机生成的字符串。假冒的服务器没有私钥,因此无法对字符串进行正确的加密,从而浏览器会得出错误的结果。这样,就可以通过证书验证对方就是真正的服务器。 
    当然,上面的过程也可能被一个假冒的服务器破坏:浏览器发送字符串给假冒的服务器,假冒的服务器没有私钥因此无法加密,但是它可以直接将字符串发送给真正的服务器,真正的服务器返回结果之后再将结果转发给浏览器,这样仍然可以欺骗浏览器让它以为自己是和真正的服务器在通信。但是,这样做对假冒服务器来说除了破坏了浏览器的通信之外,并无法获取、篡改机密信息,因为浏览器在建立和服务器(无论是真正的服务器还是假冒的服务器),都会再生成一个对称加密的密钥,之后在通信的时候都使用这个密钥进行加密,而只有真正的服务器才能够通过私钥解开这个密钥,假冒的服务器除了获得加密之后的数据之外,其他什么也做不了(当然,它可以修改数据,但是这可以通过数据的完整性校验被发现)。因此,只要身份认证没有问题,中间人攻击就无法进行。

使用预设置的证书

    在搭建vpn服务器的时候,也可以通过手动在本地存储对方服务器的证书,从而在之后进行双方服务器的身份认证。服务器都先在本地生成公私钥对,然后将公钥拷贝到对方的机器上,这样之后在进行通信的时候,就可以使用公私钥对来进行身份确认。

使用临时分配的证书

    有可能通信双方需要临时在网络上交换公钥,他们网络比较安全,交换的公钥并不会被窃取,但实际并不是这样,此时就会出现一种更为可怕的中间人攻击:

假如A和B认为,任何网站都是不可靠的,他们从未并且今后也不会在网上公布自己的公钥。为了加密通信,A需要亲自告诉B他的公钥,B也需要亲自告诉A自己的公钥。收到公钥后,双方便用对方的公钥加密进行数据传输。因为用这个公钥加密后,只有对方才能解开密码,因此双方都认为这条通信线路是安全的。其实,他俩的麻烦大了。这条线路并不是安全的,第三者可以用一种很搞笑的方式来窃听消息。假设有一个人C知道A和B之间将有一次加密通话。C劫持了A和B之间的通讯线路。现在,A把他的公钥发给B,这个公钥传到一半时被C拦截下来,于是C获得了A的公钥;C再把他自己的公钥发给B,让B把C的公钥错当成A的公钥。同样地,B把他自己的公钥发给A,被C拦截下来。C把自己的公钥发给A,让A以为那是B的公钥。以后,每当A给B发加密消息时,A其实是用C的公钥在加密;C把A的消息解密后,再用B的公钥加密后传给B。类似地,一旦B给A发送消息,C都可以将消息解密,并用A的公钥进行加密后传过去。此时,A和B都以为自己在用对方的公钥加密,并都能用自己的私有钥匙解开对方传来的密文;殊不知,这中间有人仅仅用了一点雕虫小技,无声无息地窃走了所有的信息。C正是利用了公钥加密术“谁都可以加密”的性质,结结实实地玩弄了A和B。

    那么,如何防范这种中间人攻击呢?

中间人之所以能够得逞,关键就是,无论是网络通话还是国际象棋,双方总是一先一后地发送信息。不过,在网络通讯中,我们有一种很特别的办法,他可以迫使中间人无法再扮演“即时翻译”的角色。首先,A把想说的话(最好是能够证明自己身份的话)进行加密,同时B也完成相同的工作。然后,A把他的加密消息的前面一半传给B,B收到后也把他的密文的一半传给A;A再把剩下的部份传给B,之后B也把他的密文的另一半回传给A。此时,A和B分别用自己的私钥进行解密,查看对方发来的消息。这带给中间人C一个不可逾越的障碍:两段密文要合在一起才能解开,中间人拿着其中一半密文,那是一点办法都没有。此时,中间人陷入了一个非常窘迫的境地,他只有两条路可选:要么硬着头皮把这半截密文发给B,当B得到全部密文后会发现用他自己的私钥根本解不开,从而意识到中间有人捣乱;要么就忽略这半截密文,自己编几句A想跟B说的话,用B的公钥加密并发一半给B。如此一来,中间人需要编造所有A和B之间的对话,这需要相当厚的脸皮,风险异常之大,要不了多久便会露出马脚。

参考

身份验证、中间人攻击和数字签名:浅谈密码学(中)


推荐阅读
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • Kali Linux 渗透测试实战指南:第24章 客户端安全威胁分析与防御策略
    客户端安全威胁分析与防御策略主要探讨了终端设备(如计算机、平板电脑和移动设备)在使用互联网时可能面临的各种安全威胁。本章详细介绍了这些设备如何作为信息和服务的提供者或接收者,以及它们在与服务器等其他系统交互过程中可能遇到的安全风险,并提出了有效的防御措施。 ... [详细]
  • 【VMware vSAN 6.6】1.1.企业级超融合基础设施存储方案:提供全面的软硬件集成支持
    ### 摘要VMware vSAN 6.6 提供了一种全面的企业级超融合基础设施(HCI)存储解决方案,支持广泛的软硬件集成。该方案通过在 vSphere Hypervisor 中内置存储功能,实现了高效的数据管理和资源利用。vSAN 6.6 的架构设计包括带有本地存储的服务器,以及优化的存储控制器虚拟系统,有效克服了传统存储系统的局限性,为企业提供了灵活、可靠的存储环境。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • ylbtech-进销存管理解决方案:进销存管理,即购销链管理,涵盖企业从采购(进)、库存(存)到销售(销)的全流程动态管控。其中,“进”涉及从市场询价、供应商选择、采购执行直至货物入库及支付流程;“销”则包括产品定价、客户报价、订单处理及销售出库等环节。该解决方案旨在通过信息化手段,提升企业运营效率,优化库存结构,增强市场响应速度。 ... [详细]
  • Python网络爬虫入门:利用urllib库进行数据抓取
    Python网络爬虫入门:利用urllib库进行数据抓取在数据科学和Web开发领域,Python凭借其简洁高效的特性成为首选语言。本文主要介绍了如何在Windows环境下使用Python的urllib库进行基本的网络数据抓取。考虑到命令行操作的不便,作者选择了Jupyter Notebook作为开发环境,不仅简化了配置过程,还提供了直观的数据处理和可视化功能。通过实例演示,读者可以轻松掌握urllib的基本用法,为深入学习网络爬虫技术打下坚实基础。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 深入解析OSI七层架构与TCP/IP协议体系
    本文详细探讨了OSI七层模型(Open System Interconnection,开放系统互连)及其与TCP/IP协议体系的关系。OSI模型将网络通信过程划分为七个层次,每个层次负责不同的功能,从物理层到应用层逐步实现数据传输和处理。通过对比分析,本文揭示了OSI模型与TCP/IP协议在结构和功能上的异同,为理解现代网络通信提供了全面的视角。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 本文探讨了Python 3.6中引入的`secrets`模块,该模块专为生成高质量的加密随机数而设计,旨在提升应用程序中的机密管理和安全性。通过使用`secrets`模块,开发者可以有效防止常见的安全漏洞,确保敏感数据的保护。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 搜索引擎提示“服务不稳定可能导致访问异常”的原因分析与解决策略 ... [详细]
author-avatar
顆顆顆顆幸福_483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有