导航:首页 > 文档加密 > ssh公匙加密

ssh公匙加密

发布时间:2024-09-14 10:07:19

‘壹’ SSH隧道协议(AES密钥对加密法则)

SSH是每一台Linux电脑的标准配置

随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的适用范围也越来越广。不仅程序员离不开它,很多普通用户也每天使用;SSH具备多种功能,可以用于很多场合。有些事情,没有它就是办不成

简单说,SSH是一种网络协议,用于计算机之间的加密登录。
如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。雹和陵
需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

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

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

上面这条命令表示,ssh直接连接远程主机的2222端口。

SSH之所以能够保证安全,原因在于它采用了公钥加密。
整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心棚裤(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是着名的“中间人攻击”(Man-in-the-middle attack)。

SSH协议是如何应对的呢?

如果你是第一次登录对方主机,系统会出现下面的提示:

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

系统会出现一句提示,表示host主机已经得到认可。

然后,会要求输入密码。

如果密码正确,就可以登录了。

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

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

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的源戚,可以直接用 ssh-keygen 生成一个:

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件: id_rsa.pub 和 id_rsa 。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

好了,从此你再登录,就不需要输入密码了。

如果还是不行,就打开远程主机的 /etc/ssh/sshd_config 这个文件,检查下面几行前面”#”注释是否取掉。

然后,重启远程主机的ssh服务。

远程主机将用户的公钥,保存在登录后的用户主目录的 $HOME/.ssh/authorized_keys 文件中。公钥就是一段字符串,只要把它追加在 authorized_keys 文件的末尾就行了。

这里不使用上面的ssh--id命令,改用下面的命令,解释公钥的保存过程:

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

(1) ”$ ssh user@host” ,表示登录远程主机;

(2)单引号中的 mkdir .ssh && cat >> .ssh/authorized_keys ,表示登录后在远程shell上执行的命令:

(3) ”$ mkdir -p .ssh” 的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;

(4) ’cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub 的作用是,将本地的公钥文件 ~/.ssh/id_rsa.pub ,重定向追加到远程文件 authorized_keys 的末尾。

写入 authorized_keys 文件后,公钥登录的设置就完成了。

‘贰’ SSH详解-3.密钥登陆

SSH详解-1.ssh基础知识
SSH详解-2.ssh基本用法
SSH详解-3.密钥登陆
SSH详解-4.多个ssh公钥

在上一篇中我们了解到了ssh基本用法,ssh通过密码进行登录。密码登录存在很多问题。密码太简单,又不安全。密码太复杂,不容易记,而且每次登录都要输入很麻烦。于是就有了密钥登陆。

什么是密钥(key)?

ssh密钥登录采用的是 非对称加密 。

非对称密钥加密系统,又称公钥密钥加密。它需要使用不同的密钥来分别完成加密和解密操作,一个公开发布,即公开密钥(public key)和,另一个由用户自己秘密保存,即私用密钥(private key)。
如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。

了解完密钥后,接下来看看密钥登录的过程,SSH 密钥登录分为以下的步骤。

第零步,准备步骤客户端通过 ssh-keygen 生成自己的公钥和私钥,并将公钥放入远程服务器的指定位置。

第一步,用户客户端向服务器发起SSH登录的请求。

第二步,服务器收到用户SSH登录的请求,服务器生成一些随机数据发送给客户端。

第三步,客户端接收到服务器发过来的数据,客户端使用私钥对数据进行签名后再返回给服务器。

第四步,服务器收到客户端加密后的数据,使用对应公钥进行解密。然后判断解密后的数据是否与原始数据一致,如果一致就允许用户登录。

ssh-keygen 是OpenSSH提供的一个命令行工具,用于生成密钥登录所需的公钥和私钥。

在上面的例子中,我使用了-t参数来指定加密算法,一遍会选择rsa或者dsa。
第一个问题,问我要保存在哪?(直接Enter默认会保存在~/.ssh/id_rsa中)因为我之前已经生成过密钥了,我就保存在tenxun里面。

第二个问题,询问是否要为私钥文件设定密码保护(passphrase)。这样的话,即使入侵者拿到私钥,还是需要破解密码。如果为了方便,不想设定密码保护,可以直接按回车键,密码就会为空。

最后,就会生成私钥和公钥,屏幕上还会给出公钥的指纹,以及当前的用户名和主机名作为注释,用来识别密钥的来源。

从上面的公钥中我们可以看到末尾的公钥注释 23696@DESKTOP-GKRBCVI
公钥注释可以用来识别不同的公钥,表示这是哪台主机(DESKTOP-GKRBCVI)的哪个用户(username)的公钥。

注意 ,公钥只有一行。因为它太长了,显示的时候可能自动换行了。

OpenSSH 规定,用户公钥保存在服务器的 ~/.ssh/authorized_keys 文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。

-i 指定要上传公钥(公钥文件可以不指定路径和 .pub 后缀名),user是所要登录的用户名,hostname是主机名,这两个参数与ssh 登录命令是一致。

特别注意 ,不是把公钥上传上去就行了,还需要把 authorized_keys 文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH服务器可能会拒绝读取该文件,导致密钥登录失效,登录的时候还需要输入密码。

提到输入密码,如果再生成公钥和私钥的时候设置了密码,使用密钥登录的时候也需要输入私钥的密码,这样可以防止他人非法窃取了私钥。

私钥设置了密码以后,每次使用都必须输入私钥密码,这个问题可以使用 ssh-agent 命令解决。

网络-密钥
Git - 生成 SSH 公钥 (git-scm.com)
ssh(1) - OpenBSD manual pages

‘叁’ SSH的工作原理

传统的网络服务程序,比如 FTP , POP , Telnet ,本质上都是不安全的,因为它们在网络上用明文传送数据、用户账号和用户口令,很容易受到 中间人 攻击方式的攻击,攻击者会冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。

为了满足安全性的需求, IETF 的网络工作小组制定了 Secure Shell (缩写为 SSH ),这是一项创建在 应用层 和 传输层 基础上的安全协议,为计算机上的 Shell 提供安全的传输和使用环境。

SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄漏问题。通过 SSH 可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。

本文将会重点讨论 SSH 中用到的加密算法和建立安全连接的过程。

为了保证信息传输的安全性, SSH 使用了对称加密、非对称加密和散列等技术。

对称密钥加密又称为对称加密、私钥加密、共享密钥加密,是密码学中一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。

SSH 使用对称密钥加密整个连接过程中传输的信息。值得注意的是,用户自己创建的public/private密钥对仅仅用于验证,不会用在加密连接上。对称加密允许对密码进行身份验证,以防止第三方窥探。

共享密钥通过密钥交换算法生成,它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。客户端和服务端都参与了这个过程,过程的细节将在后面阐述。

生成的密钥将用来加密这次会话过程中客户端和服务端传输的数据。这个过程会在验证客户身份之前完成。

SSH 支持多种对称密钥算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客户端和服务端可以配置采用算法的列表。客户端列表中第一个能被服务端支持的算法将被采用。

比如在Ubuntu 14.04上,客户端和服务端默认的配置如下: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256 , arcfour128 , [email protected] , [email protected] , [email protected] , aes128-cbc , blowfish-cbc , cast128-cbc , aes192-cbc , aes256-cbc , arcfour 。
也就是说,如果两台Ubuntu 14.04采用默认配置,它们总是会采用 aes128-ctr 算法来加密连接。

在非对称加密方法中,需要一对密钥,一个是私钥,一个是公钥。这两个密钥数学相关。用公钥加密后所得的信息,只能用私钥才能解密。如果知道了其中一个,并不能计算另外一个。因此,如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。

SSH 在一些地方使用了非对称加密。

在密钥交换过程中使用到了非对称加密。在这个阶段,客户端和服务端生成临时密钥对,并且交换公钥来生成共享密钥。

在身份验证的过程中也使用了非对称加密。 SSH 密钥对用来向服务端验证客户端身份。客户端创建一对密钥,然后将公钥上传到远程服务器上,写入文件 ~/.ssh/authorized_keys 。

在创建共享密钥后,客户端必须向服务端证明身份。服务端会使用文件中的公钥加密一段信息,并将加密后的信息发送给客户端。如果客户端可以能够破解这段信息,那么就能够证明自己拥有相关的私钥。之后服务端会为客户端设置shell环境。

散列是电脑科学中一种对资料的处理方法,它通过某种特定的算法将要检索的项与涌来检索的索引关联起来,生成一种便于搜索的数据结构(散列表)。它也常用做一种资讯安全的方法,由一串资料中经过散列算法计算出来的资料指纹,来识别档案和资料是否有被篡改。

SSH 主要使用了散列消息认证码(Keyed-hash message authentication code,缩写为HMAC),来确认消息没有被篡改。

上面提到的对称加密协商过程中,会使用消息认证码(MAC)算法。这个算法会从客户端支持的算法中选出。

在密钥协商完成后,所有的消息都必须携带MAC,用于通信双方验证消息的一致性。MAC值由共享密钥,消息的分组序列和实际消息内容计算得到。

在对称加密区域之外,MAC本身作为分组的最后部分被发送。研究者通常建议先机密数据,然后计算MAC

SSH 协议采用客户端-服务端模型对两方进行身份验证,并对它们之间的数据进行加密。

服务端在指定端口监听连接请求。它负责协商安全连接,认证连接方,并为客户端生成正确的shell环境。

客户端负责协商安全连接,验证服务器的身份是否与以前记录的信息相匹配,并提供凭证进行身份验证。

SSH会话分为两个阶段。第一个是同意和建立加密来保护未来的沟通。第二个阶段是对用户进行身份验证,并发现是否应该授予对服务器的访问权限。

当客户端发起请求后,服务端返回支持的协议版本。如果客户端可以匹配其中一个协议版本,则连接继续。服务端会提供它的公共主机密钥,客户端可以用这个密钥来验证服务端是否合法。

此时,通信双方采用迪菲-赫尔曼算法来协商会话密钥。

该算法的大致过程如下:

用于其余连接的共享密钥加密被称为二进制数据包协议。上述过程允许双方平等地参与生成共享密钥。

生成的密钥是对称密钥,这意味着用于加密消息的密钥也可以用于解密。其目的是将后面的通信包装在不能被外部人员解密的加密隧道中。

在生成会话密钥后,就开始进行用户身份验证。

根据服务器接受的方式,有几种不同的方法可用于身份验证。

最简单的方法是密码验证,其中服务器要求客户端输入尝试登陆账号的密码。密码是通过协商加密发送的。

虽然密码被加密,但由于密码的复杂性受到限制,因此通常不建议使用此方法。与其他身份验证的方法相比,自动脚本相对容易攻破正常长度的密码。

最为推荐的选择是使用SSH密钥对。SSH密钥对是非对称密钥。

公钥用于加密只能用私钥解密的数据。公钥可以自由共享,因为没有从公钥中导出私钥的方法。

验证流程如下:

可以看到,密钥的不对称性允许服务端使用公钥加密消息给客户端。然后,客户端可以通过正确解密消息来证明它拥有私钥。

笔者本科专业是信息安全,不过毕业后并没有从事安全行业,工作4年课堂上学习的知识基本忘的差不多了。
而SSH算是工作中最常用到的东西之一,其工作原理涉及不少密码学的东西。
写这篇博文,一是希望能帮助读者了解SSH,二也是希望自己能捡起一些专业知识。在互联网/软件相关行业里,不论是否从事安全工作,了解这些东西都是很有必要的。

‘肆’ 非对称加密、SSH加密算法、数字签名简介

非对称加密算法的核心源于数学问题,它存在公钥和私钥的概念,要完成加解密操作,需要两个密钥同时参与。我们常说的“公钥加密,私钥加密”或“私钥加密, 公钥解密”都属于非对称加密的范畴。公钥加密的数据必须使用私钥才可以解密,同样,私钥加密的数据也 只能通过公钥进行解密。
  相比对称加密,非对称加密的安全性得到了提升,但是也存在明显的缺点,非对称加解密的效率要远远小于对称加解密。所以非对称加密往往被用在一些安全性要求比较高的应用或领域中。

RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学者:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
  它的原理较为简单,我们假设有消息发送方A和消息接收方B,通过下面的几个步骤,我们就可以完成消息的加密传递:
 (1)消息发送方A在本地构建密钥对,公钥和私钥;
 (2)消息发送方A将产生的公钥发送给消息接收方B;
 (3)B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信;
 (4)反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。
  由于公钥是消息发送方A暴露给消息接收方B的,所以这种方式也存在一定的安全隐患,如果公钥在数据传输过程中泄漏,则A通过私钥加密的数据就可能被解密。
  如果要建立更安全的加密消息传递模型,需要消息发送方和消息接收方各构建一套密钥对,并分别将各自的公钥暴露给对方,在进行消息传递时,A通过B的公钥对数据加密,B接收到消息通过B的私钥进行解密,反之,B通过A的公钥进行加密,A接收到消息后通过A的私钥进行解密。
  当然,这种方式可能存在数据传递被模拟的隐患,我们可以通过数字签名等技术进行安全性的进一步提升。由于存在多次的非对称加解密,这种方式带来的效率问题也更加严重。可以详读这两篇文章:RSA 算法原理 (一) (二)

在SSH安全协议的原理中, 是一种非对称加密与对称加密算法的结合,先看下图:

这里进行一下说明:
(1)首先服务端会通过非对称加密,产生一个 公钥 私钥
(2)在客户端发起请求时,服务端将 公钥 暴露给客户端,这个 公钥 可以被任意暴露;
(3)客户端在获取 公钥 后,会先产生一个由256位随机数字组成的会话密钥,这里称为口令;
(4)客户端通过 公钥 将这个口令加密,发送给服务器端;
(5)服务器端通过 私钥 进行解密,获取到通讯口令;
 之后,客户端和服务端的信息传递,都通过这个口令进行对称的加密。
 这样的设计在一定程度上提高了加解密的效率,不过,与客户端服务端各构建一套密钥对的加解密方式相比,在安全性上可能有所下降。在上面所述的通过口令进行加密的过程中,数据也是可以被窃听的,不过由于密钥是256个随机数字,有10的256次方中组合方式,所以破解难度也很大。相对还是比较安全的。服务端和客户端都提前知道了密钥,SSH的这种方式,服务端是通过解密获取到了密钥。

现在知道了有非对称加密这东西,那数字签名是怎么回事呢?
 数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。
 有了上述非对称加密算法,就可以实现这个需求:

阅读全文

与ssh公匙加密相关的资料

热点内容
python可以计算大规模数值吗 浏览:912
什么服务器跑代码好跑 浏览:205
如何对文件夹所有文件进行编号 浏览:980
windows10反编译程序 浏览:843
如何把安卓app传到另一个手机 浏览:178
马自达6空调压缩机响 浏览:681
这程序员真可爱 浏览:450
编程猫编程的费用 浏览:627
贪心算法几个经典例子详细解读 浏览:421
u盘被别人加密怎么办 浏览:485
查看wrf的编译 浏览:942
瑞幸app如何预约自提 浏览:687
安卓怎么能关掉搜索 浏览:221
简单实用的桌面文件夹 浏览:402
解开压缩包打开文件夹 浏览:14
解压日本喜剧 浏览:870
如何看出服务器性能配置 浏览:649
程序员怎么变成少女 浏览:270
acr9000独立式可编程运动控制器 浏览:764
java数据结构书籍 浏览:362