------部分内容系引用
1.介绍
SSH:SecurityShell 缩写,在互联网层次中与http,ftp类似,属于应用层协议。目的是为shell提供安全的传输和使用环境。具体来说,通过它可以安全的远程执行另一台unix系统之上的机器的命令,在没有ssh之前通常使用telnet来实现相同目的,没有保障。
SSL: 安全套接层(Secure Sockets Layer,SSL),一种安全协议,是网景公司(Netscape)在推出Web浏览器首版的同时提出的,目的是为网络通信提供安全及数据完整性。SSL在传输层对网络连接进行加密。此协议和其继任者是TLS。
这两者的目的类似,都是安全的在网络环境中交换数据,实现技术也类似。但由于他们在协议栈中的地位不同,所以不能混为一谈。常见的https就是典型的假设在ssl协议基础之上
2.背景知识
加密技术:了解他们的原理需要一点点加密的概念,这里把需要的概念做一下简单阐述:
加密一般分为三类,对称加密,非对称加密及单向散列函数。
对称加密使用统一的秘钥将原文计算得到密文,可以通过该秘钥解密得到原文。最原始的密码学诞生于对称加密,如凯撒加密(Caesar cipher) 。密码学发展至今,为了提高破解难度,数学家发明了许多更牛逼的算法:当前主流的对称加密算法包括DES、AES。(来自wiki)为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。
非对称加密(又叫公钥密码学)以1976年狄菲(Whitfield Diffie)与赫尔曼(Martin Hellman)两位学者以单向函数与单向暗门函数为基础创建。该算法使用一对秘钥:公钥和私钥,以公钥加密原文得到密文可以由私钥解密;反之亦可以通过公钥来解密。该技术是构成网络加密的重点。常见的非对称加密有Diffie-Hellman、RSA、椭圆曲线加密算法。
加密过程如下:
A发给B:以B的公钥加密后发给B,B以己方私钥解开的到原文。
B发给A:以A的公钥加密后发给A,A以己方私钥解开的到原文。
该过程避免了对称加密的绕不过去的问题:如何将秘钥安全的交给对方
单向散列函数与前两者略有不同,首先是单向的,密文无法被解密为原文。同时,密文也具有“长度很小”的特点,因此也被称为签名、数字签名。它的作用于不是用于得到原文,而是为了验证原文的准确性和完整性。安全领域中经典的数字签名技术主要就是应用了单向散列函数。常见的单向散列函数包括MD5(MD5由MD4、MD3、MD2改进而来,一度被广泛应用于计算机安全领域。但由于近年来MD5的弱点不断被发现,以及当今计算机运算能力的不断提升,现在已经可能人为构造出两个具有相同MD5校验值的信息,使本算法不再适合现今的安全领域。目前,MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的错误检查领域。例如在一些BitTorrent下载中,软件将通过计算MD5检验下载到的文件片段的完整性。)、SHA(Secure Hash Algorithm)。目前对SHA的破解也属于数学界的新课题,我国科学家王小云等发表能在263个计算复杂度内找到碰撞的攻击法,对该课题的研究处于世界前列。
中间人问题是安全领域中的经典问题,也是我们探讨的加密技术要解决的主要问题。所谓的MITM攻击就是通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方却毫不知情。这时,一个良好的加密算法+加密机制能发挥很大的作用。
3.正题
3.1 SSH
SSH协议工作在TCP协议之上。意味着是一个长连接,并且每个传输请求都以TCP连接的形式来建立、发送和关闭。
SSH协议框架中最主要的部分是三个协议:
* 传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性 等的支持;
* 用户认证协议(The User Authentication Protocol) 则为服务器提供客户端的身份鉴别;
* 连接协议(The Connection Protocol) 将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用; 各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。
与此相对应的,SSH协议的工作过程也分为连接、用户认证和传输三个阶段,或是更细分的五个阶段:
- 版本号协商阶段
- 密钥和算法协商阶段
- 认证阶段,SSH客户端向服务器端发起认证请求, 服务器端对客户端进行认证
- 会话请求阶段, 认证通过后,客户端向服务器端发送会话请求
- 交互会话阶段 ,会话请求通过后,服务器端和客户端进行信息的交互
第一阶段 版本号协商。SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本。
第二阶段 密钥和算法协商。SSH支持多种加密算法, 双方根据本端和对端支持的算法,协商出最终使用的算法。
然后开始协商密钥,该密钥就是之后大家共同使用的“会话密钥”。这意味着从第三步开始,数据是不会被中间人窃听和篡改的。以Diffie Hellman为例,简单说明密钥生成过程:
Alice和Bob是要建立ssh连接的两台机器,甭管哪个是client。
首先双方都知道对方的公钥,此处的m和x。Alice随机数i作为种子,得到f(x,m,i)记为p;同理Bob得到f(x,m,j)记为q
然后双方将得到的半个“密码”很放心的交给对方,双方都计算得到k(p,q)。
第三阶段 认证阶段。跟地下党人接头一样,上一部作用是先找个没人的地方,确保安全,接下来该验证对方的身份了。否则把情报给了国民党那就得不偿失了。最简单的方式就是报上名来,并且证明你是这个人--张三,我看看我的通讯录里记录的张三是不是同志,一看是的,可以交情报了。这就是提供用户名和密码。还有一种认证方式,出示可靠的凭证,即令牌。武侠小说中拿出一个牌子,你就可以进去了,说明是同伙,不是同伙就不会有令牌,这是一个基本的认定。
第四阶段 会话请求阶段。服务器处理客户端的请求。请求被成功处理后, 服务器会向客户端回应 SSH_SMSG_SUCCESS包,SSH进入交互会话阶段;否则回应 SSH_SMSG_FAILURE包,表示服务器处理请求失败或者不能识别请求。
第五阶段 交互会话阶段。服务器接收到报文,解密后执行该命令,将执行的结果加密发还给客户端;
总结:SSH设计之初是为了替代telnet执行远程机器的指令并返回结果,现在在可视界面上也可以通过ssh来保证安全,还有rsync+ssh可以实现文件安全上传,cvs+ssh可以实现代码安全同步,使用令牌式认证可以实现安全的定时任务。使用ssh加密的代理服务器可以实现FQ,,我猜测也是因为加密后难以被墙吧。
3.2 SSL\TLS
如前文所说,SSL是传输层的协议。单独讨论SSL略显抽象,我们看看应用最广泛的HTTPS,管中窥豹。HTTPS 即http协议加上ssl的产物,http协议是明文传输,而https能够实现对请求的网站身份验证以及传输信息的加密,它是如何实现的呢?
证书是由认证机构(CA)颁发给web网站的一个许可,而根证书则是用户信任认证机构的基础。根证书有两种:官方根证书以及自签发根证书,如下图(来自互联网)所示,官方根证书是由认证机构和浏览器制作者进行协商,直接内置在浏览器之中的。从用户选择了某款浏览器开始,用户就信任了官方根证书对应的认证机构。而自签发根证书用于一些局域网,手工安装自己相信的机构颁发的根证书,从而使用该机构认证的服务网站。自签发认证机构产生主要因为得到官方认证机构的认可需要money。
上图同时描述了一次https建立连接的过程,即安全校验方面的,主要有两个目的:
- 验证所访问网站的合法性,杜绝钓鱼网站、黑网站
- 加密自己和该网站的传输数据,以防泄密、篡改、中间人问题
该过程具体描述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构,以客户端公钥C_PuKey加密后通知到浏览器;
3.客户端通过私钥C_PrKey解密后,获得网站证书要做以下工作:
验证证书的合法性(证书本身是否伪造?颁发证书的机构是否合法?证书中包含的网站地址是否与正在访问的地址一致?)证书受信任,或者是用户接受了不受信的证书。否则拒绝访问,如果是,
4.从刚才回传的信息中获得服务器选择的加密方案,并随机选择一个通话密钥key,接着用服务器公钥S_PuKey加密后发送给服务器;
5.服务器接收到的浏览器传送到消息,用私钥S_PrKey解密,获得通话密钥key, 接下来的数据传输都使用该对称密钥key进行加密。