我最近在 cloud9 (c9.io) 上建立了一个项目。当你在 cloud9 上建立项目时,有一个包含公钥和私钥的 .ssh 目录。我假设这些是在您设置帐户时生成的。
创建 git 仓库后,我将源设置为 GitHub 上的一个空仓库,并尝试将其推送到上游。不出所料,我没有权限。
我复制了我的公钥的内容并将其添加到 GitHub。那时我可以推送到 GitHub。
我很好奇为什么 GitHub 只需要公钥。当我试图 push 时,幕后发生了什么?私钥有什么作用?
最佳答案
SSH 公钥身份验证是 challenge-response .
你的公钥和私钥是mathematically related , 但是从公钥计算私钥在理论上是不可能的。选择 key 值,以便只有拥有私钥的人才能解密已使用相关公钥加密的消息。
继续简化说明,身份验证顺序如下
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,用户和主机都有 key 。这就是 SSH 要求您在第一次连接时确认主机 key 的原因。目的是检测中间人攻击。感谢Diffie-Hellman,整个对话都是加密的引导过程。
你们实际上从未交换过敏感信息。这就是挑战-响应的思想。假设你有一把物理 key ,你声称它可以打开一扇门。为了给我演示,你可以给我 key ,但我可能不会还给它。也许你甚至不想让我看到门后的东西。足以证明您的说法是能够将门稍微打开一点,并且您永远不会失去这样做的 key 。
另请参阅: How is using a public-key for logging in to SSH any better than using a password?在 Unix 和 Linux SE 上。
关于git - 为什么 GitHub 只需要我的公钥就可以推送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28479567/