公钥与私钥,加密与认证

一直弄不明白 ssh-keygen 生成的公钥和私钥都有什么用。也不清楚免密登陆和密码登陆有什么区别,在这里记录一下相关的知识和总结

一直弄不明白 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 的免密登陆

  1. 生成密钥

     $ 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
        
  2. 发送公钥给服务端

     ssh-copy-id   root@10.0.122.133
     ssh-copy-id   服务端用户@服务端ip
    
  3. 登陆

     ssh root@服务端ip
    

ssh 密码登陆

ssh  用户名@服务端ip

用 ssh 通过密码登陆服务器时,不需要生成密钥对, 客户端会把服务端的公钥存放在当前用户家目录下的 .ssh/known_hosts,(放的是服务端系统的公钥 /etc/ssh/ .pub)

而免密登陆需要客户端把自己的公钥给服务端,服务端接收后会保存在用户家目录中的 .ssh/authorized_keys 文件中