Linux 两台主机之间建立信任关系方式及基本原理
前言:
去年学过一段时间的现代密码学,最近在配置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 两台主机之间建立信任关系方式及基本原理相关推荐
- Linux两台主机之间建立信任关系
Linux两台主机之间建立信任关系 一般用ssh命令访问另一台机器,或者用scp命令从别的机器拷贝数据和文件,都要输入对应账户的密码.而在两台机器之间建立信任关系,则可以省略输入密码的过程. 一 : ...
- 两台 Linux 主机之间配置信任关系(以及如何解除)
主机之间的 ssh 信任,简单地说,就是主机之间使用 ssh 命令登录主机不需要密码. 一.主机之间配置信任关系 将主机 A (47.100.247.242) 作为信任主机,主机 B(10 ...
- Linux主机之间建立信任 公钥私钥 ssh免密登录 一台主机直接控制另一台主机执行命令
工作中有时我们需要用一台服务器去控制另一台服务器执行命令,或者将一些文件拷贝到另一台服务器上,但是这种操作指令默认是需要输入密码的,如果频繁操作的话就会很麻烦,或者如果用代码控制服务器执行命令时需要密 ...
- 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理
一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...
- linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝
linux两台服务器之间文件/文件夹拷贝 跨服务器拷贝需要用到的命令是scp. ----------------------拷贝文件夹--------------------------------- ...
- linux两台服务器传输,Linux两台服务器之间高速数据传输命令:scp应用详解
Linux两台服务器之间高速数据传输命令:scp应用详解 Linux scp命令用于Linux之间复制文件和目录到另外一台,这个命令在多台服务器之间传输还是非常有用的,速度也是非常快的.比window ...
- 关于SSH服务|两台机器之间建立免密通道
ssh:用在linux或者unix的远程控制服务协议 sshd占用22端口 在linux系统下面/etc/ssh文件中 sshd_config文件是服务器端的配置 ssh_config是客户端的配置 ...
- linux同步某台服务器,linux 两台服务器之间开机自动同步指定目录下的文件
linux 两台服务器之间开机自动同步指定目录下的文件 服务器B(172.17.166.11)上开机或者重启会自动拉取服务器A(172.17.166.10)上指定目录下所有文件 1.创建服务器B到服务 ...
- #两台主机之间通信时为什么要用IP地址,而不直接用硬件地址?
两台主机之间通信时为什么要用IP地址,而不直接用硬件地址? 既然在网络链路上传送的数据帧最终是用硬件地址来寻找目的主机,为什么还要用IP地址进行通信,为什么不直接是用硬件地址进行通信? 首先要 ...
最新文章
- 清华构建新一代数据集NICO,定义图像分类新标准
- pandas -表的横向合并 纵向合并
- 每日一皮:产品经理的黑化,你听过几个?
- 表达对别人的感激之情
- Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)...
- 怎样批量获取文件名,批量提取文件名 文件名读取windows 批处理文件
- 拓端tecdat|在UBUNTU虚拟机上安装R软件包
- Oracle 11G GoldenGate实现Windows与Windows之间的单向同步
- 分布式配置中心-Disconf入门指南
- BT服务器的安装和配置
- sharepoint如何解锁被用户锁定的文件?
- 银行票据+票据池相关的项目讲解
- 汇编中的int 10h 与int 19h
- python greedy 加油次数
- 建立网站费用大概需要多少钱?
- docker pull报错:Timeout exceeded while awaiting headers解决思路
- dedecms教程:织梦搬家错位,链接不上数据库
- 【学生护眼台灯怎么样选择?推荐专业护眼灯热门四大品牌无标题】
- VLOOKUP常见错误及解决办法
- Java实现Excel批量导入数据