【问题标题】:Why Does GitHub only need my public key in order to push?为什么 GitHub 只需要我的公钥就可以推送?
【发布时间】:2015-04-13 07:30:00
【问题描述】:

我最近在 cloud9 (c9.io) 上建立了一个项目。在 cloud9 上建立项目时,有一个 .ssh 目录,其中包含公钥和私钥。我假设这些是在您设置帐户时生成的。

创建 git 存储库后,我将源设置为 GitHub 上的一个空存储库,并尝试将其推送到上游。不出所料,我没有权限。

我复制了我的公钥的内容并将其添加到 GitHub。那时我可以推送到 GitHub。

我很好奇为什么 GitHub 只需要公钥。当我尝试推动时,幕后发生了什么?私钥的作用是什么?

【问题讨论】:

    标签: git github ssh-keys


    【解决方案1】:

    SSH 公钥认证为challenge-response

    您的公钥和私钥是mathematically related,但从公钥计算私钥在理论上是不可能的。选择密钥值时,只有拥有私钥的人才能解密使用相关公钥加密的消息。

    继续简单的解释,认证顺序是这样的

    ek_ny:大家好,我是 ek_ny,我的公钥是 abc123

    c9.io: 哦,是吗?好吧,如果你真的是 ek_ny,那么当我发送给你时,你知道我的意思[加密秘密信息“神奇的词是 squeamish ossifrage”]00:01:02:03:aa:...

    ek_ny:事实上,你给我发来 [解密] “神奇的词是娇气的 ossifrage。”

    c9.io: ek_ny,我的老朋友!很高兴见到你!来吧!

    使用 SSH,用户和主机都有密钥。这就是为什么 SSH 在您第一次连接时要求您确认主机密钥的原因。目的是检测中间人攻击。由于Diffie-Hellman 引导了整个过程,整个对话都被加密了。

    您实际上从未交换过敏感信息。这就是挑战-响应的概念。假设您有一把物理钥匙,声称可以打开一扇门。为了向我证明这一点,你可以把钥匙给我,但我可能不会把它还给我。也许你甚至不想让我看到门后的东西。足以证明您的主张是能够轻轻敲开门,并且您永远不会失去这样做的钥匙。

    另请参阅:How is using a public-key for logging in to SSH any better than using a password? 在 Unix 和 Linux SE 上。

    【讨论】:

      【解决方案2】:

      顾名思义,私钥是私有的。它是你的,也是你的。你永远不应该把私钥给任何人。

      您的私钥允许您签署消息。然后,您发送带有签名的消息,任何拥有您的公钥的人都可以验证签名是否与消息匹配。这就是公钥密码学的原理。所以 Github 只需要你的公钥来检查你是否就是你声称的那个人。

      【讨论】:

      • 我会说“声称是”而不是“假装是”。
      【解决方案3】:

      公钥系统(例如 ssh 使用的公钥系统)中的一般概念是,公钥用于检查数字签名以验证您是您声称的身份。私钥用于创建签名。

      当您尝试对 github 进行身份验证时,它不需要您的私钥。它只需要你的公钥来检查你是否就是你声称的那个人。 wikipedia有更多信息。

      【讨论】:

        【解决方案4】:

        本质上,您只需要在使用私钥“签署”数据时向 github 提供公钥,并使用公钥来验证它实际上是您本人。这就是为什么 github 需要公钥。它是非对称密码学。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-20
          • 2020-07-06
          • 2020-12-25
          • 1970-01-01
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          • 2013-04-16
          相关资源
          最近更新 更多