PRELOADER

本站基于Hexo创建,收藏java相关技术文档。

当前文章 : 《网络协议SSH》

3/18/2019 —— 

本文主要总结自己SSH和SSL/TLS协议的理解。

加密算法

对称加密简介

  1. 对称加密,就是加密和解密使用相同密钥的算法,密钥就是控制加密解密过程的指令,而加密算法是一组计算规则,旨在规定如何对数据进行加密和解密。俗称单密钥加密算法。
  2. 单密钥加密算法优点是算法公开、计算量小,加密酸度快,效率高;缺点是当两人距离较远,没有办法安全的传输秘钥,秘钥一旦泄露,就无安全可言。
  3. 常见单密钥加密算法
    • DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
    • DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
    • AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;
    • Blowfish、RC2、RC4、RC5等等;

RSA加密简介

  1. 1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。这种算法可以在不直接传递秘钥的情况下,完成解密。

  2. 非对称加密算法需要两个秘钥,公钥(publickey)和私钥(privatekey),两者是一对,用公钥加密的数据,只能用对应的私钥才能进行解密,而用私钥加密的数据,只有用对应的公钥才能解密;因为加密和解密使用的是不同的蜜月,所以称作非对称加密。

  3. 1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的”非对称加密算法”。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

    这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。

    点击此处查看RSA算法原理简介

  4. 虽然非对称加密很安全很强大,但是它也有缺点,相对于对称加密它计算量更大,计算时间更长。所以在大规模数据的安全通信场景中,普遍采用非对称加密技术来交换对称加密密钥,通信中数据都采用对称加密技术加密

SSH协议

SSH简介

  1. SSH是Secure Shell的缩写,是有IETF网络工作小组(Network Working Group)所制定;SSH是创建在传输层和应用层的安全协议;基于此协议的网络数据进行传输时,都会被加密,即便被第三方截获,也无法进行解密,因为它采用了RSA非对称加密方式。
  2. 需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY/XSHELL等工具,这需要另文介绍。
  3. SSH原理简介SSH一篇来自博客园的讲解。

基本用法

  1. 命令行远程登录

    ssh root@47.52.80.556
    

    如果本地用户名与远程用户名一致,登录时可以省略用户

    ssh 47.52.80.556
    

    ssh默认端口是22,也就是说,你的登录请求会送到远程主机的22端口,我们可以用p参数指定端口

    ssh -p 2222 root@47.52.80.556
    

中间人攻击(man-in-the-middle)

  1. RSA算法本身是安全的,但是还是存在中间人攻击问题,就是一个第三方用户冒充服务器接收用户的数据,然后冒充用户把数据发送给服务器。

    比如A和B两个人,A生成了一对RSA密钥,本来是B拥有A的公钥,B用来加密数据,传输给A,A用自己的私钥解密数据,看似完美。如果C想冒充A给B发送数据,就可以自己也生成一对RSA密钥,将公钥偷偷放到了B的电脑,然后冒充A给B发了消息,B接到消息后以为是A发送的,然后将回了信息,其实信息发送给了C,C接到消息后,冒充B像A发送请求,A以为是B,就像C回了信息,这样一来一回,A和B之间的所有通信,其实都被C拿到了。

  2. 解决中间人攻击

    为解决这个问题,SSH协议采用由人工判断公钥的fingerprint是否可信的方式。当使用ssh命令或工具连接服务器时,命令行会提示如下信息:

    The authenticity of host 'host (47.52.80.556)' can't be established.
    RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
    Are you sure you want to continue connecting (yes/no)?
    

    一般网站或机构都会将本服务器的公钥放在网站上,这样我们就可以比对两者是否一样,如果是一样就接受连接,当我们输入yes时,系统会出现如下警告

    Warning: Permanently added 'host,47.52.80.556' (RSA) to the list of known hosts.
    

    然后会要求我们输入密码

    Password: (enter password)
    

    当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

    每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

公钥登录

  1. 所谓公钥登录,原理很简单,就是用户将自己的公钥存储到远程主机上。每次登录的时候,远程主机会向用户发送一段随机字符串,客户机用自己的私钥加密,然后发送给远程主机,远程主机用存储的用户公钥解密,如果是原来发送的字符串,就证明用户是可信的,直接允许登录shell。

  2. 公钥登录要求用户提供自己的公钥,如果没有,可以使用ssh命令创建一个

    #步骤1:
    cd  ~/.ssh ls
    #这两个命令就是检查是否已经存在id_rsa.pub或id_dsa.pub文件,如果文件已经存在,那么你可以跳过步骤2
    
    #步骤2:创建一个SSH Key 
    ssh-keygen -t rsa -C "你的email地址"
    #代码参数含义: 
    #-t指定密钥类型,默认是rsa,可以省略。 
    #-C设置注释文字,比如邮箱。 
    #-f指定密钥文件存储文件名
    

    运行完上面的命令后,系统会出现一系列提示,可以一路回车。其中有一个问题,创建过程中会让用户选择对私钥设置口令(passphrase),如果担心私钥安全,可以设置一个,不设置就直接回车。

    命令运行结束后,在/home/.ssh/目录下,会生成两个文件,id_rsa.pub和is_rsa两个文件,前者是公钥,后者是私钥,私钥需要妥善保管。

  3. 可以运行以下命令将本地公钥传送到远程主机的host里面

    ssh-copy-id root@47.52.80.556
    
  4. 如果做完上述设置仍旧不能免密登录,到远程主机的/etc/ssh/sshd_config文件,检查下面几行注释是否去掉

    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    

    然后重启系统

    service ssh restart
    #或者下面方式
    /etc/init.d/ssh restart
    
  5. authorized_keys文件

    用来保存公钥的文件,当有客户机用ssh协议请求连接server主机时,远程主机会将客户机的公钥保存到$HOME/.SSH/authorized_keys文件中,公钥就是一段字符串,只要把它追加到authorized_keys文件末尾就行了。

    ssh root@47.52.80.556 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
    

    这条命令由多个语句组成,分解开来看

    ssh root@47.52.80.556表示登录主机;

    单引号中的内容表示登录后在远程shell上执行的命令;如果用户主目录中.ssh目录不存在,就创建一个,cat>>.ssh/zuthorized_keys<~/.ssh/id_rsa.pub表示将本地公钥文件内容重定向追加到远程文件authorized_keys文件的末尾。

SSL/TLS

  1. 诞生背景

    SSH其实是专门为shell设计的通信协议,它跨了两个层,传输层和应用层,通俗点将就是只有SSH工具客户端,和SSH服务器才用的上该协议。现实环境中更需要一个通用的,建立在与应用层无关层面的一个安全传输协议,这样,不论是HTTP/FTP/POP等任何应用协议,都可以依赖其进行安全的通信传输。SSL协议就是在这种背景下诞生的。

  2. 面临问题

    SSL相比SSH,面临着一个重要问题,就是如何解决中间人攻击问题,SSL是面向广大客户群的,想要让他们使用SSL协议进行传输,不可能让每个人还去学习SSL,还人工识别比对fingerprint吧,这很明显不现实。

  3. 数字证书/原文

    为了解决这个问题,诞生了CA(certificate authority)数字证书颁发机构,该机构一般都是非常知名的权威大公司,他们为有需要的客户,比如A颁发数字证书,数字证书中包含了客户的公钥、客户信息、证书机构信息,当访问A的某个网站需要用到SSL协议时,A的服务器会让用户下载安装他们的证书(由权威CA证书颁发机构签发),证书里有CA证书颁发机构用私钥对证书摘要加密后形成的数字签名,用数字证书签发机构的公钥(这些权威CA签发机构的公钥是浏览器提前内置的)解密数字签名,拿到证书摘要,和浏览器计算证书摘要相符,验证通过,信任问题就解决了。我们从证书里拿到客户A的公钥,然后我们用A的公钥加密数据与A通讯。

  4. HTTPS百度版/HTTPSwiki版

    读完上面内容,理解HTTPS就简单了,它的全称是 Hypertext Transfer Protocol Secure,也称为HTTP over TLS, HTTP over SSL,其实就客户端与服务系之间的HTTP通信基于TLS或则SSL协议。对于HTTP协议和SSL/TLS协议本身没有任何特殊定制,因为SSL/STL本身对HTTP协议就是透明的,HTTP在SSL/TLS上运作也不需要任何特殊处理。