浅析ssh与scp原理及实现

前言

ssh(Secure Shell)是一种用于远程管理和安全数据传输的协议。它提供了一种安全的方式,使得用户可以在不安全的网络上登录到远程计算机并执行命令。ssh的应用广泛,不仅可以用于远程登录,还可以进行文件传输、端口转发等操作。本文将探讨ssh的基本原理和组成,以及ssh的两种级别的验证方法。

ssh登录及原理

首先我们都知道ssh是一个远程授权的协议,通过ssh可以进行一些远程登录等操作,而scp就是在连接上远端服务器的ssh后又启动了一个scp进程,通过操作系统的stdinstdout进行数据通信。

而火热的xshellxftp其实就是对这两个命令的封装,xshell用来远程登录,xftp用来远程传输文件。

ssh之前,其实就有一些能够实现远程登录的方式了,比如telnet(终端仿真协议),rcp(scp就是对rcp的升级),ftp等,但它们都是不安全的,并且会用明文传输密码,即使在私网上也有篡改和窃取的风险。

传统的远程服务如ftp很容易受到中间人攻击,所谓中间人就是存在另一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户将数据发送给真正的服务器。

ssh:secure shell 是由IETF制定的建立在应用层基础上的安全网络协议,专为远程登录会话和其他网络服务提供安全性的协议,通过SSH可以将所有传输的数据进行加密(RSA),同时能防止DNS欺骗和IP欺骗,并且数据经过压缩,可以加快传输的速度。

ssh组成与实现

  1. 传输层协议SSH-TRANS : 这部分提供了服务器认证,保密性及完整性,此外它还能够提供压缩功能,SSH-TRANS通常运行在TCP/IP之上,也可能用于其他可靠的数据流上,TRANS提供了强力的加密技术、密码主机认证及完整性保护
  2. 用户认证协议:用于向服务器提供客户端用户鉴别功能,运行在运输层协议上,从低层协议接受会话标识符
  3. 连接协议:将多个加密隧道分成逻辑通道,运行在用户认证之上,提供交互式登录话路、远程命令执行。转发TCP IP连接等

ssh协议的具体实现:

  • 服务器建立公钥,每次启动sshd服务时,sshd会主动去找/etc/ssh/ssh_host*文件,如果系统刚创建还没有这些文件,那么sshd会主动计算出这些公钥,同时也会计算出自己需要的私钥
  • 客户端主动联机请求,如果客户端想要联机到ssh服务器,需要一个客户端程序,比如已经可以使用sshcmd或者xshell这种使用了ssh的应用程序
  • 服务器传输公钥给客户端,在拿到客户端请求之后,服务器把公钥给客户端
  • 客户端记录并比对服务器公钥的数据,如果是第一次连接,则会把服务器公钥记录下来,如果不是第一次连接,则会去对比之间的记录,查看是否有差异。如果没有问题,客户端会接受这个公钥,然后开始计算客户端自己的公钥和私钥
  • 客户端计算出自己的公钥和私钥会后回传给服务器,此时服务器就具有了服务器的私钥和客户端的公钥,客户端就有了服务器的公钥和客户端的私钥,开始非对称加密

ssh两种级别的验证方法

  • 第一级(基于口令):只要知道账号和口令,就能够登录到远程主机。所有的传输数据都会被加密,但不能保证连接的服务器是真实想要连接的服务器
  • 第二级(基于密钥):客户端需要为自身创建一对密钥,并把公钥放在需要访问的服务器上,如果要连接到ssh服务器,客户端会向服务器发出请求,需要用密钥进行安全验证。服务器收到之后,在目录下寻找保存的客户端公钥,再与现在客户端发过来的公钥进行对比。如果两个密钥一致,服务器就会用这个密钥加密chanllenge并发送回客户端,客户端收到之后用自己的私钥解密,然后再发送给服务器完成登录。(显然安全性比第一级高)

ssh和scp命令格式

使用ssh登录远程服务器

ssh -p port user@host_ip

然后输入密码

scp从远程复制文件

传输一个文件

scp -P port username@remote_host:/path/to/remote/file /path/to/local/destination

传输一个目录

scp -r -P port username@remote_host:/path/to/remote/dictory /path/to/local/destination

如果需要用scp将本地文件复制到远程 只要将命令格式反过来就行

结语

ssh作为一种安全的远程管理协议,为用户提供了安全、可靠的远程登录和数据传输方式。同时,scp作为ssh的衍生工具,提供了文件传输的便捷方式。这两个工具可谓是所有开发人员必会的基本功。

相关推荐
祈澈菇凉1 小时前
Webpack的基本功能有哪些
前端·javascript·vue.js
小纯洁w1 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
anddddoooo1 小时前
域内证书维权
服务器·网络·网络协议·安全·网络安全·https·ssl
想睡好2 小时前
css文本属性
前端·css
qianmoQ2 小时前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
zhoupenghui1682 小时前
golang时间相关函数总结
服务器·前端·golang·time
mit6.8242 小时前
[实现Rpc] 通信-Muduo库的实现 | && 完美转发 | reserve | unique_lock
c++·网络协议·rpc
孤雪心殇2 小时前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
White graces2 小时前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
庸俗今天不摸鱼2 小时前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设