一直弄不明白 ssh-keygen 生成的公钥和私钥都有什么用。也不清楚免密登陆和密码登陆有什么区别,在这里记录一下相关的知识和总结
总结
ssh 登陆方式 | 过程 |
---|---|
密码登陆 | 把服务器公钥放在自己的 .ssh/known_hosts 中 |
免密登陆 | 把自己的公钥放在服务器的 .ssh/authorized_keys 文件 |
具体说明
首先公钥和私钥来自密码学中的加密方式:对称加密和非对称加密。
对称加密中通信双方使用的是一个密钥,非对称加密会产生两个密钥,一个密钥加密之后,另一个密钥可以解密。目前公认最强的加密算法是 RSA 公钥加密算法,它是由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA 就取名于他们三者的名字。它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA 算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
来源于密码学中的非对称加密最主要应用就是公钥加密和公钥认证,而且公钥加密的过程和公钥认证的过程是不一样的,这里又涉及到了加密和认证两个概念。
-
加密
加密是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,用于数据保护。重点在于数据的安全性
-
认证
认证用于某个身份的真实性,确认身份后给予不同的权限。重点在于保证用户的真实性
所以传输数据时涉及到的是密钥的加密与解密,而 ssh 远程登陆涉及到的是密钥的认证过程,这是两个不同的方面
密钥的加密与解密过程
知乎RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?很好的回答了这个问题,我们可以从 RAS 加密算法的过程了解一二
-
RSA 加密机制
RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。
-
$KeyGen(\lambda) \to (PK, SK)$
密钥生成算法以安全常数 $\lambda$ 作为输入,输出一个公钥PK,和一个私钥SK。
-
$Encrypt(PK, M) \to CT$
加密算法以公钥PK和待加密的消息M作为输入,输出密文CT。
-
$Decrypt(SK, CT) \to M$
解密算法以私钥SK和密文CT作为输入,输出消息M。
所以,公钥用于对数据进行加密,私钥用于对数据进行解密
-
-
RSA 签名机制
签名体制同样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Vertify(验证算法)。
-
$KeyGen(\lambda) \to (PK, SK)$
在RSA签名中,密钥生成算法与加密算法完全相同。
-
$Sign(SK, M) \to \delta$
签名算法以私钥SK和待签名的消息M作为输入,输出签名 $\delta$
-
$Vertify(Pk, \delta, M) \to b$
验证算法以公钥PK,签名 $\delta$ 以及消息M作为输入,输出一个比特值b。b=1意味着验证通过。b=0意味着验证不通过。
所以,在签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。
-
还可以参考知乎《数字签名是什么》形象的理解什么是加密、解密和验证
-
背景
A 有公钥和私钥,A 把公钥送给其他人(B, C, D…)
-
B -> A
B明文 + A公钥 –> B密文。B 将消息通过公钥加密,发给 A
-
A 解密消息
B密文 + A私钥 –> B明文。A 用私钥解密 B 密文,得到明文
-
A –> B
-
A回文 + hash函数 -> digest
-
digest + A私钥 = 数字签名
-
A回文 + 数字签名 –> B
A 给 B 回信时决定采用”数字签名”。先用 Hash 函数生成信件的摘要(digest);然后用私钥,对这个摘要加密,生成”数字签名”(signature)。再将这个签名,附在信件下面,一起发给 B
hash 函数:把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值
-
-
B 验证
-
B 收到回信,取出数字签名,用 A公钥 解密到得回信的A摘要(digest)
-
B 将回信明文本身用 Hash 函数得到B摘要
-
若 B摘要 == A摘要 则此信未被修改
-
ssh 的免密登陆
-
生成密钥
$ ssh-keygen
在
.ssh/
目录下生成 id_rsa 私钥和 id_rsa.pub 公钥,公钥用于非密码认证方式时,传送给对方,作为信任的凭证。所以客户端需要发送自己的公钥给服务端,服务端接收后会保存在用户家目录中的
.ssh/authorized_keys
文件中-
测试
-
保存到本地来验证
# 保存到本地 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys ssh localhost
如果测试失败,可以尝试修改过相关目录的权限再尝试
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
-
-
-
发送公钥给服务端
ssh-copy-id root@10.0.122.133 ssh-copy-id 服务端用户@服务端ip
-
登陆
ssh root@服务端ip
ssh 密码登陆
ssh 用户名@服务端ip
用 ssh 通过密码登陆服务器时,不需要生成密钥对, 客户端会把服务端的公钥存放在当前用户家目录下的 .ssh/known_hosts
,(放的是服务端系统的公钥 /etc/ssh/ .pub)
而免密登陆需要客户端把自己的公钥给服务端,服务端接收后会保存在用户家目录中的 .ssh/authorized_keys
文件中