为什么 GitHub 只需要我的 public 键就可以推送?

Why Does GitHub only need my public key in order to push?

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

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

我复制了 public 密钥的内容并将其添加到 GitHub。那时我能够推送到 GitHub.

我很好奇为什么 GitHub 只需要 public 键。当我试图推动时,幕后发生了什么?私钥有什么作用?

私钥,顾名思义,是私有的。这是你的,而且只属于你。你不应该把私钥给任何人。

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

public 密钥系统(例如 ssh 使用的系统)的一般思想是 public 密钥用于检查数字签名以验证您是否是您声称的身份。私钥用于创建签名。

当您尝试根据 github 进行身份验证时,它不需要您的私钥。它只需要你的 public 密钥来检查你是否是你声称的那个人。有关 wikipedia.

的更多信息

本质上,您只需要给 github public 密钥,因为您使用 "sign" 数据的私钥和 public 密钥来验证它实际上是你。这就是为什么 github 需要 public key.It 的非对称密码学。

SSH public-密钥认证是challenge-response.

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

继续简化说明,身份验证顺序为

ek_ny: Hi, I’m ek_ny, and my public key is abc123.

c9.io: Oh yeah? Well, if you really are ek_ny, then you know what I mean when I send you [encrypts secret message “The magic words are squeamish ossifrage”] 00:01:02:03:aa:...

ek_ny: As a matter of fact, you sent me [decrypts] “The magic words are squeamish ossifrage.”

c9.io: ek_ny, my old buddy! Good to see ya! C’mon in!

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

你们实际上从未交换过敏感信息。这就是挑战-响应的思想。假设你有一把物理钥匙,你声称它可以打开一扇门。为了给我演示,你可以给我钥匙,但我可能不会还给它。也许你甚至不想让我看到门后的东西。足以证明你的说法是只能稍微打开门,而且你永远不会失去这样做的钥匙。

另见: How is using a public-key for logging in to SSH any better than using a password? on Unix & Linux SE。