SSH实现电脑VScode免密登录到虚拟机其原理

news2025/1/13 6:16:38

在网上想看一下这个原理。发现写的还是比较乱,所以自己总结了一份方便回顾

SSH免密登录的原理主要基于非对称密钥加密技术,比较常用的是RSA算法。

以下是SSH免密登录的详细步骤和原理:

1. 生成密钥对

  • 在客户端上生成一对密钥,包括一个私钥和一个公钥。私钥将保留在客户端,而公钥将被复制到远程服务器。
  • 这一步通常使用ssh-keygen命令来完成,该命令会生成一对密钥(默认是RSA密钥对),并将私钥保存在~/.ssh/id_rsa文件中,公钥保存在~/.ssh/id_rsa.pub文件中。

2. 复制公钥到服务器

  • 将客户端生成的公钥复制到远程服务器的~/.ssh/authorized_keys文件中。这可以通过使用ssh-copy-id命令或手动将公钥内容添加到文件中来完成这一步是为了在后续接收到客户端的公钥时进行比对。
  • ssh-copy-id命令会自动将公钥追加到远程服务器上的~/.ssh/authorized_keys文件中,如果该文件不存在,则会先创建该文件。
  • 在SSH通信中,~/.ssh/authorized_keys 文件是SSH服务器用来验证客户端公钥的地方。这个机制允许SSH服务器确认尝试连接的客户端是否持有与服务器上存储的公钥相对应的私钥,从而实现了免密登录和身份验证。这个过程是单向的,即客户端主动连接到服务器,并请求服务器执行某些操作或提供服务。务器本身不会主动通过SSH连接去“访问”客户端。某些黑客的服务器就算有了用户的公钥,也只是可以让用户登录到该服务器,并不能反向操作用户的电脑。

3. 连接远程服务器

  • 当客户端尝试连接到远程服务器时,它会向服务器发送一个连接请求,其中包括客户端的公钥(实际上,在初次连接时,客户端并不直接发送公钥,而是在后续的身份验证过程中使用)。
    第一次连接主要是建立tcp连接,然后交换对应协议的版本信息。再协商会话期间将要使用的加密算法、密钥交换算法、消息认证算法。

4. 身份验证过程

服务器在通过检索authorized_keys文件与请求连接的客户端所发送的内容中存在相同的公钥时。证明该客户端是合法的请求,但是仍需验证在客户端中有公钥对应的密钥。否则公钥是比较容易被获取的,黑客可以通过这个公钥进行合法的请求连接。所以需要验证请求连接的服务器上有对应的私钥,才能证明是对应合法且唯一的客户端。

  • 挑战-响应机制
    • 远程服务器生成一个随机数(挑战)作为质询,并使用客户端的公钥(从~/.ssh/authorized_keys文件中读取)加密这个随机数。
    • 加密后的挑战被发送给客户端。
    • 客户端使用自己的私钥解密这个加密的挑战,并将解密后的结果(响应)发送回服务器。
    • 服务器将解密后的挑战与原始的挑战进行比较,如果两者匹配,则身份验证成功,服务器允许客户端登录。

5. 会话密钥协商(可选,但常见于增强安全性)

  • 在一些实现中,SSH协议还会在身份验证之后进行会话密钥的协商,以确保后续的通信安全。
  • 这一步通常涉及客户端和服务器之间的密钥交换协议,以生成一个共享的会话密钥,用于加密后续的通信数据。

6. 安全性考虑

  • SSH免密登录的安全性依赖于私钥的保密性。如果私钥被泄露,攻击者就可以冒充客户端进行登录。
  • 因此,建议定期更换私钥,并确保私钥文件的安全存储(例如,使用强密码保护私钥文件,或将其存储在安全的硬件中)。

总结

        在SSH免密登录的过程中,私钥并不是直接用来“解密”公钥加密的文件或挑战。这里的“解密”过程实际上是利用了非对称加密技术的特性,其中公钥用于加密数据,而对应的私钥用于解密这些数据。这是非对称加密技术的核心原理之一。

会话密钥加密技术详细解释

会话密钥(Session Key)生成

  1. 初始化客户端发起与服务器的连接请求。作为响应,服务器将其公钥 As 发送给客户端。这个公钥将被用于加密后续发送给服务器的敏感信息。

  2. 会话ID交换:为了确保会话的唯一性,服务器生成一个会话ID p 并将其发送给客户端

  3. 会话密钥生成客户端生成一个随机的会话密钥 q,该密钥将用于后续通信的加密。然后,客户端计算 r = p ⊕ q(其中  表示异或操作),这样服务器就可以在接收到 r 和已知 p 的情况下恢复出 q

  4. 加密传输 r客户端使用服务器的公钥 As 加密 r,然后将加密后的数据发送给服务器。这样,只有服务器(拥有私钥 Bs)能够解密并恢复出 r

  5. 解密与密钥恢复服务器使用私钥 Bs 解密接收到的加密数据,得到 r。然后,服务器通过执行 q = r ⊕ p 来恢复出会话密钥 q

至此,客户端和服务器都拥有了相同的会话密钥 q,可以使用它来对后续通信进行加密。

认证

  1. 随机数生成与加密为了验证客户端是否确实拥有会话密钥 q服务器生成一个随机数 x,并使用客户端的公钥加密 x,生成 S(x),然后发送给客户端。

  2. 解密随机数:客户端使用对应的私钥 Bc(与 Ac 配对)来解密 S(x),从而得到随机数 x

  3. 哈希计算与传输:客户端使用会话密钥 q 和随机数 x 来计算哈希值 n(q+x)(注意:这里 q+x 可能是指将 q 和 x 连接起来的字符串,因为直接对数字进行加法运算在哈希上下文中没有意义)。然后,客户端将 n(q+x) 发送给服务器。

  4. 哈希验证:服务器也使用会话密钥 q 和随机数 x 来计算哈希值 m(q+x)。然后,服务器比较 m(q+x) 和从客户端接收到的 n(q+x)

  5. 认证成功:如果 m(q+x) 和 n(q+x) 相同,则服务器确认客户端确实拥有正确的会话密钥 q,并且认证成功。

请注意,在哈希计算中,q+x 通常应该被理解为将 q 和 x 的二进制表示连接成一个更长的字符串,然后再对这个字符串进行哈希计算。此外,虽然MD5在某些情况下仍然被使用,但由于其已知的安全弱点,建议使用更安全的哈希函数,如SHA-256。

会话密钥加密技术简略解释

双方获得会话密钥

  • server在会话连接时需要发送会话ID与自己的公钥给client。
  • client在接收到数据后,用自己的会话密钥与收到的会话ID进行异或,然后用收到的公钥进行加密并发送回去给server。
  • server在收到数据后会利用私钥解密并且进行数学运算,然后可以得到相同的会话密钥。

由server分配会话ID,client提供会话密钥。server提供加密工具(公钥),client利用加密工具加密,server利用解密工具(私钥)解密。从而令双方获得会话密钥。这个密钥就可以用来后续通信的加密。

认证

此时server与client都具有了相同的会话密钥,但这个结果的达成只是需要client请求连接,server发送自己的公钥,结果为server获得会话密钥q。但是还需要验证client拥有私钥

  • server产生一个随机数x,用client的公钥加密后得到S(x)然后将该数据发送给client。
  • client获得加密后的数据后,需要用client自身的私钥进行解密获得x,然后再用会话密钥 q 和随机数 x 来计算哈希值 n(q+x)。并直接将该值发送回给server。
  • server端同样使用会话密钥 q 和随机数 x 来计算哈希值 m(q+x)。然后,服务器比较 m(q+x) 和从客户端接收到的 n(q+x)
  • 如果 m(q+x) 和 n(q+x) 相同,则服务器确认客户端确实拥有正确的会话密钥 q,并且认证成功。验证了拥有server authorized_keys文件内公钥对应的密钥的客户端有相同的会话密钥,允许通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统复习Java日志体系

一&#xff0c;我们采用硬编码体验一下几个使用比较多的日志 分别导入几种日志的 jar 包 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSch…

【已解决】YOLOv8加载模型报错:super().__init__(torch._C.PyTorchFileReader(name_or_buffer))

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C#——Json数据存储

本文使用的软件为VS2022&#xff0c;不同的软件使用上有些许差异。 C#数据存储 关于数据存储&#xff0c;一般在退出控制台之后&#xff0c;暂存的数据都会释放掉&#xff0c;有没有什么方法能够在下一次进入的时候还能加载上一次的数据呢&#xff1f;答案是有的&#xff0c;关…

利用Arcgis设置分式标注(分子分母标注)

因工作需要&#xff0c;需要设置分式标注&#xff0c;下面详细介绍下如何利用arcgis 设置分式标注&#xff0c;以下操作以供参考&#xff0c;如有疑义可提出。 一、准备工作 软件&#xff1a;arcmap 示例数据&#xff1a;行政区shp矢量图 二、操作步骤 1.添加数据 将行政区sh…

Golang | Leetcode Golang题解之第307题区域和检索-数组可修改

题目&#xff1a; 题解&#xff1a; type NumArray struct {nums, tree []int }func Constructor(nums []int) NumArray {tree : make([]int, len(nums)1)na : NumArray{nums, tree}for i, num : range nums {na.add(i1, num)}return na }func (na *NumArray) add(index, val …

MinIO安装(思路、方法、步骤(以centos8安装为例))

MinIO安装&#xff08;思路、方法、步骤&#xff08;以centos8安装为例&#xff09;&#xff09; 简介 MinIO 是一个高性能、开源的对象存储系统&#xff0c;旨在提供简单、可扩展的存储解决方案&#xff0c;特别适用于大数据、AI 和 ML 应用。 步骤记录 首先我们进入官网看…

前端使用 Konva 实现可视化设计器(19)- 连接线 - 直线、折线

本章响应小伙伴的反馈&#xff0c;除了算法自动画连接线&#xff08;仍需优化完善&#xff09;&#xff0c;实现了可以手动绘制直线、折线连接线功能。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 gitee…

最全个人笔记【Makefile】

1. 基本概念 1.1 make是什么 当一个项目中要编译的文件很多时&#xff0c;手工使用编译器一个个进行编译&#xff0c;很明显不具有可操作性&#xff0c;此时必须借助某些软件&#xff0c;协助我们有序地、正确地自动编译整个工程的所有该编译的文件。这样的软件被称为 工程管…

Simulink|基于粒子群算法的永磁同步电机多参数辨识

目录 主要内容 模型研究 结果一览 下载链接 主要内容 仿真程序参考文献《改进粒子群算法的永磁同步电机多参数辨识》&#xff0c;采用粒子群算法与simulink模型结合的方式&#xff0c;对永磁同步电机进行多参数辨识。程序以定子绕组电阻、d轴电感、q轴电感和永磁…

ai写作免费版工具上哪找?一文详解5大ai写作神器

面对写作难题&#xff0c;你是否曾感到力不从心&#xff1f;从创意枯竭到语法错误&#xff0c;每个写作环节都可能成为挑战。但如今&#xff0c;有了ai写作工具的帮助&#xff0c;这些难题都能迎刃而解。今天&#xff0c;就让我们一起来看看ai写作免费网页版应该怎么选吧&#…

Win11系统文件资源管理器鼠标右键卡顿解决方法

引用链接&#xff1a; Windows 11文件资源管理器崩溃怎么解决&#xff1f;看看这7个解决办法&#xff01;

订单搜索分页查询业务

文章目录 概要整体架构流程技术细节小结 概要 订单搜索分页查询是电商、物流、零售等众多行业中的常见需求&#xff0c;主要用于管理和分析大量订单数据. 需求分析以及接口设计 技术细节 1.Controller层: 根据接口设计来写 ApiOperation("订单搜索")GetMapping(…

使用plink和git进行数据处理

首先使用git进行plink环境配置&#xff0c;显示环境安装成功&#xff0c;在此环境下可以使用plink 在基因型数据处理过程中&#xff0c;看到vcf文件后首要做的就是将vcf文件转成二进制文件&#xff0c;输入命令 plink --vcf genotype.vcf --allow-extra-chr --recode --out tes…

滑动窗口代码实现

public int minSubArrayLen(int target, int[] nums) {int len nums.length;int res len 1;//最大是len&#xff0c;如果最后res结果还是n1说明没有答案返回0int sum0;int left0;for(int right0; right<len; right){sumnums[right];while(sum>target){//不需要判断rig…

算法 —— 递推

目录 递推 数楼梯 斐波那契数列 一维数组递推 P1002 过河卒 二维数组递推 P1044 栈 卡特兰数 递推 将一个很大的任务分解成规模小一些的子任务&#xff0c;子任务分成更小的子任务&#xff0c;直到遇到初始条件&#xff0c;最后整理归纳解决大任务的思想就是递推与递…

Kafka基本概念,工作流程介绍

1、消息队列与Kafka 1.1、Kafka简介 Kafka使用scala开发&#xff0c;支持多语言客户端&#xff08;c、java、python、go等&#xff09; Kafka最先由LinkedIn公司开发&#xff0c;之后成为Apache的顶级项目。 Kafka是一个分布式的、分区化、可复制提交的日志服务 LinkedIn使…

麒麟系统查看和修改ip

查看ip ifconfig ifconfig enp0s3 192.168.1.110

ROS中自定义头文件和源文件

今天分享一下如何在ROS中进行头文件和源文件的调用。案例是实现输出"Hello World" 本文的头文件(即.h文件)放在include/${project_name}路径下, 源文件和可执行文件则在src文件夹下 第一步&#xff1a;创建工作空间&#xff0c;创建包&#xff0c;使用vscode打开工作…

mysql高级语句的查询语句

一、排序语法&#xff0c;关键字排序 升序和降序 默认的排序方式就是升序 升序&#xff1a;ASC 降序&#xff1a;DESC 配合语法&#xff1a;order by 语法 1、升序 select * from info order by name; 根据名字升序排序&#xff0c;不需要加ASC select * from info order…

kubernetes prometheus 系列| helm 部署prometheus+grafana

一、环境准备 部署k8s集群 k8sv1.26直通车搭建 安装存储类 nfs动态供给直通车 安装helm工具 https://github.com/helm/helm/releases tar -zxvf helm-v3.5.4-linux-amd64.tar.gz sudo mv linux-amd64/helm /usr/local/bin/helm chmod ox /usr/local/bin/helm helm version二、…