前言:
去年学过一段时间的现代密码学,最近在配置github, Linux主机之间建立信任关系的时候都用到了其中一些知识,所以刚好整理一下,想直接看操作方式的可直接拉到下面

密码学基本知识

一 现代密码学基本知识

  • 现代密码学的分类:
    对称密码体制(传统密码体制)
    非对称密码体制(公钥密码体制)

  • 现在密码学的基本原则:
    实际上的安全(虽然没有在理论上严格证明出来,但经过许多人许多年的攻击并没有找到有效的攻击方法)
    柯克霍夫原则(密码系统的安全性不应该取决于不易改变的算法,而应该取决于可随时改变的密钥)

二 对称密码体制的缺陷

  • 密钥分配问题
    通信双方要进行保密通信,需要通过秘密的安全通道传送或协商加密密钥,而这种安全通道在实际中很难实现

  • 密钥管理问题
    在有N个用户的通信网络中,每个用户要想和其他N-1个用户进行通信,必须使用N-1个密钥,而系统中总的密钥数量将达到n(n-1)/2。当n 比较大时,这样大的密钥量,在生产和保存,传递,销毁等各个环节将变得复杂,易存在安全隐患。

  • 数字签名问题
    对称密码体制中通信双方拥有同样的密钥,所以接收方可以伪造签名,发送方也可以否认发送过某消息,难于解决陌生人之间的身份认证和交易不可否认的问题

三 公钥密码体制加解密原型

  • 发送方A查找接收方B的公钥

  • A用公钥加密算法以B的公钥作为加密密钥对明文进行加密

  • A通过不安全信道将密文发送给B

  • B收到密文后使用自己的私钥对密文解密还原成明文

四 RSA加密算法及签名算法分析(因为linux ssh 登陆用的是ssh 所以单独分析一下)

转自 http://www.zhihu.com/question/25912483/answer/31653639,具体细节请移步大神的数学讲解。

RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。

其中公钥用于对数据进行加密,私钥用于对数据进行解密。当然了,这个也可以很直观的理解:公钥就是公开的密钥,其公开了大家才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才能够解密密文。否则大家都能看到私钥,就都能解密,那不就乱套了。

=================分割线=================
RSA签名体制。签名体制同样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。

在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解:对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行,大家看到签名都能通过验证证明确实是我自己签的。

用公钥加密,私钥解密 —加密文件
用私钥加密,用公钥解密 –数字签名

Linux两台主机之间建立信任关系

一般用ssh命令访问另一台机器,或者用scp命令从别的机器拷贝数据和文件,都要输入对应账户的密码。而在两台机器之间建立信任关系,则可以省略输入密码的过程。

一 : 首先来分析一下口令登陆的过程:
(转自http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html)

  • 远程主机收到用户的登录请求,把自己的公钥发给用户。
  • 用户使用这个公钥,将登录密码加密后,发送回来。
  • 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

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

$ ssh user@hostThe authenticity of host 'host (12.18.429.21)' 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)?

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

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是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

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

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

然后,会要求输入密码。

 Password: (enter password)

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

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

这里我认为采用的是RSA的加密和解密方案。

二: 建立信任关系的过程
(转自 http://tobeyouth.github.io/2014/07/14/ssh-login.html)

假设现在有两台主机A和B,要在B上建立对A的信任,需要先在A主机上生成ssh-key。如果不清楚A主机是否已经有ssh-key了,可以先执行:

ls ~/.ssh

看看.ssh文件夹中是否存在id_rsa,id_rsa.pub这两个文件,其中id_rsa.pub就是前面提到的公钥。

如果之前没有生成过这两个文件,那么需要执行:

 ssh-keygen -t rsa

(在这里插个链接讲ssh -keygen各个参数含义的,有兴趣的可移步
http://killer-jok.iteye.com/blog/1853451)

系统会弹出几个选项供选择,如果没有特殊需要,一路默认下去就行了,最后会在~/.ssh文件夹中生成我们所需要的id_rsa和id_rsa.pub,然后打印出id_rsa.pub看看

cat ~/.ssh/id_rsa.pub

接下来,我们先不要关闭A主机,在另一界面登录B,查看B的.ssh文件夹下有没有authorized_keys这个文件,如果没有的话,需要新建一个:

vim authorized_keys

把刚才打印出的A主机的id_rsa.pub的内容添加到其中就可以了。

至此,B对A的信任关系就算建立上了,可以在A主机上试试用ssh方式登录B看看,这个时候如果不需要输入密码,就证明信任关系已经建立成功了。

注意因为sshd有严格的权限要求,所以如果还需要输入密码的话,可以到B主机看看.ssh文件夹和authorized_keys文件的权限。

.ssh文件夹的权限应为755,authorized_keys文件的权限应为600,可以使用chmod命令来更改:

chmod 755 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

私以为这个过程用的是RSA的数字签名的原理,而并非加密解密原理,或者是加密和签名组合在一起处理,因为当A想要不需要密码便可以访问B的时候,需要把A的公钥放在B的可信赖文件中,当A直接ssh B的时候,B会向用户A发送一段随机字符串,A用自己的私钥加密后,再发回来。B用事先储存的公钥进行解密,如果成功,就证明用户A是可信的,直接允许登录shell,不再要求密码。

这与RSA数字签名算法的过程是吻合的,所以认为原理应该是这样的。

Linux 两台主机之间建立信任关系方式及基本原理相关推荐

  1. Linux两台主机之间建立信任关系

    Linux两台主机之间建立信任关系 一般用ssh命令访问另一台机器,或者用scp命令从别的机器拷贝数据和文件,都要输入对应账户的密码.而在两台机器之间建立信任关系,则可以省略输入密码的过程. 一  : ...

  2. 两台 Linux 主机之间配置信任关系(以及如何解除)

      主机之间的 ssh 信任,简单地说,就是主机之间使用 ssh 命令登录主机不需要密码.   一.主机之间配置信任关系   将主机 A (47.100.247.242) 作为信任主机,主机 B(10 ...

  3. Linux主机之间建立信任 公钥私钥 ssh免密登录 一台主机直接控制另一台主机执行命令

    工作中有时我们需要用一台服务器去控制另一台服务器执行命令,或者将一些文件拷贝到另一台服务器上,但是这种操作指令默认是需要输入密码的,如果频繁操作的话就会很麻烦,或者如果用代码控制服务器执行命令时需要密 ...

  4. 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理

    一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...

  5. linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝

    linux两台服务器之间文件/文件夹拷贝 跨服务器拷贝需要用到的命令是scp. ----------------------拷贝文件夹--------------------------------- ...

  6. linux两台服务器传输,Linux两台服务器之间高速数据传输命令:scp应用详解

    Linux两台服务器之间高速数据传输命令:scp应用详解 Linux scp命令用于Linux之间复制文件和目录到另外一台,这个命令在多台服务器之间传输还是非常有用的,速度也是非常快的.比window ...

  7. 关于SSH服务|两台机器之间建立免密通道

    ssh:用在linux或者unix的远程控制服务协议 sshd占用22端口 在linux系统下面/etc/ssh文件中 sshd_config文件是服务器端的配置 ssh_config是客户端的配置 ...

  8. linux同步某台服务器,linux 两台服务器之间开机自动同步指定目录下的文件

    linux 两台服务器之间开机自动同步指定目录下的文件 服务器B(172.17.166.11)上开机或者重启会自动拉取服务器A(172.17.166.10)上指定目录下所有文件 1.创建服务器B到服务 ...

  9. #两台主机之间通信时为什么要用IP地址,而不直接用硬件地址?

    两台主机之间通信时为什么要用IP地址,而不直接用硬件地址?   既然在网络链路上传送的数据帧最终是用硬件地址来寻找目的主机,为什么还要用IP地址进行通信,为什么不直接是用硬件地址进行通信?   首先要 ...

最新文章

  1. 清华构建新一代数据集NICO,定义图像分类新标准
  2. pandas -表的横向合并 纵向合并
  3. 每日一皮:产品经理的黑化,你听过几个?
  4. 表达对别人的感激之情
  5. Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)...
  6. 怎样批量获取文件名,批量提取文件名 文件名读取windows 批处理文件
  7. 拓端tecdat|在UBUNTU虚拟机上安装R软件包
  8. Oracle 11G GoldenGate实现Windows与Windows之间的单向同步
  9. 分布式配置中心-Disconf入门指南
  10. BT服务器的安装和配置
  11. sharepoint如何解锁被用户锁定的文件?
  12. 银行票据+票据池相关的项目讲解
  13. 汇编中的int 10h 与int 19h
  14. python greedy 加油次数
  15. 建立网站费用大概需要多少钱?
  16. docker pull报错:Timeout exceeded while awaiting headers解决思路
  17. dedecms教程:织梦搬家错位,链接不上数据库
  18. 【学生护眼台灯怎么样选择?推荐专业护眼灯热门四大品牌无标题】
  19. VLOOKUP常见错误及解决办法
  20. Java实现Excel批量导入数据

热门文章

  1. 21 个好用的持续集成工具,总有一款适合你
  2. 全新UI运营级在线客服系统源码+无授权/带教程
  3. 关于25岁学编程会不会晚的最佳回答!
  4. FPGA芯片的GTX/GTH/GTY/GTP/GTZ/GTM高速信号有什么区别?
  5. 学习区块链(一)--我为什么要学习区块链?
  6. HTML5.笔记.案例
  7. 安装python教程
  8. 爬取起点小说+mongoDB存储
  9. Matlab算法之优化计算1
  10. networkx画弯曲的边