ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GitHub、PAT 与 SSH 说明

GitHub、PAT 与 SSH 说明

什么是 GitHub

一句话:GitHub 是一个网站,程序员把代码存到上面,像游戏存档一样一次次记录,电脑坏了也不怕;很多人还能在同一个项目上一起改,谁改了什么一目了然。

通俗地说:就像你写论文,每改一版就另存一个文件——改砸了能退回上一版;电脑坏了文件还在云端;和同学合作时,各自改各自的副本,改完提交让对方过目。GitHub 就是把这套"另存为 + 云盘 + 合作批改"搬到了写程序上,还顺便成了程序员互相看代码、抄作业、提建议的公共广场。

PAT 通俗解释

PAT 是什么(一句话):一个由 GitHub 发给你的、代替密码使用的"长字符串密码",专门用于命令行和程序登录 GitHub。

它是这样的东西:一串约 40 位的随机字符,形如ghp_Xy123...;在 GitHub 网页上自己生成,只显示一次;git 推拉代码时用户名照旧,密码栏粘贴它。

为什么存在:GitHub 密码太重要(能改密码、删仓库),不该到处填。PAT 是专门给程序用的替身,权限有限、有有效期、泄露了能立刻作废,主密码不动。

💡 类比:密码 = 万能主钥匙,能开你名下所有门、还能配新钥匙;PAT = 单间限时门卡,只能开指定房间、到期自动失效、随时注销。丢一张门卡,主钥匙安然无恙。

为什么用 PAT 代替账号密码

一句话回答:因为密码一旦泄露,攻击者就能控制你的整个账号,而 PAT 能把损失限制在一个可随时作废的凭据上。

2018 年 8 月,GitHub 遭遇撞库攻击:攻击者用其他网站泄露的密码批量尝试登录,约 9.5 万用户受影响。根源是用户复用密码。于是 GitHub 于 2021 年 8 月正式禁用命令行密码登录,只接受 PAT 或 SSH。

PAT(Personal Access Token)的优势:可限定权限范围(scope)、可设有效期、泄露后可秒级作废,且不等于主账号密码

PAT 与 SSH 的对比

维度PATSSH Key
协议HTTPSSSH
凭据形式一串文本令牌公钥 + 私钥密钥对
认证方式出示令牌本身(令牌即凭据)只传用私钥算出的签名,私钥本体绝不出门
有效期可设置,会过期永不过期
配置难度简单,适合新手稍麻烦,一次搞定

💡 共同点:两者都代替密码完成身份验证,权限都可在 GitHub 端集中管理。

为什么 PAT 可以设置有效期?是 HTTPS 保证的吗?

不是。有效期由 GitHub 服务端控制——PAT 存在 GitHub 数据库中并记录过期时间,每次请求服务端校验,到点拒绝。HTTPS 只保证传输不被窃听;SSH 私钥存在本地、服务端无登记,所以无法自动过期。

PAT 的交互过程(时序图)

公钥和私钥是什么?(颜料例子)

**私钥和公钥长什么样子?**本质是两个数:私钥 = 一个非常大的随机数;公钥 = 用它算出的一个坐标点。平时见到的是存这两个数的文本文件。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPseudocodeExamplePublicKeyText user@laptop
-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmVudGl0eQAAAAAAAAABAAAAGg== -----END OPENSSH PRIVATE KEY-----

为什么说私钥是"随机数",看到的却是一堆字母数字混合?

私钥本质是一个 256 位的大数(约 32 字节),直接打印是不可读的乱码字节。字母数字混合是 Base64 编码——把二进制字节按 6 bit 一组映射到 64 个可打印字符。字母只是数的"外衣",解码后就是纯数字。

什么是 Base64?

Base64 是一种"把二进制翻译成可打印文字"的编码方案。每 6 位二进制共 2⁶ = 64 种组合(取值 0–63),正好配 64 个符号,故名 Base64。它不是加密,只是换写法,任何人都能解码还原。对应关系如下:

数值范围二进制位数对应字符数量
0–25000000–011001A–Z26
26–51011010–110011a–z26
52–61110100–1111010–910
62111110+1
63111111/1

合计 26 + 26 + 10 + 1 + 1 = 64,正好对应 2⁶ 种组合。末尾用 = 补齐不足的字节。

它的存在是为了解决"传输兼容性"——早期邮件、网页、配置文件只认文字,遇到不可见的控制字节就会出错。把二进制套上一层字母外衣,就能安全穿过这些系统。

图示说明:图片里含 NUL 字节(值 0)时,邮件系统把它当成"消息结束"指令,后面的数据全部截断,收件方只拿到半张图;同样的数据经 Base64 编码后,值 0 被写成字母 A,全部变成没有特殊含义的普通字符,邮件系统原样送达,收件方解码后完整还原。

所以 Base64 的本质是:把可能撞上指令的字节,全部换成安全字符,让数据活着到达。

🔑 公钥敢公开,正因推不出私钥;若能推出,公开公钥即等于公开私钥,体系崩塌。私钥泄露则须立即作废密钥对。

颜料的例子:两桶原色(私钥)搅拌成混合色(公钥),一秒搞定;但从混合色还原原色和比例,全球计算机算到宇宙末日也不行。

钥匙的用途(方向相反,缺一不可):别人用你的公钥把信息锁进箱子,世界上唯一能打开的是你的私钥(保隐私);你用私钥盖的章,别人用公钥能验真(保真实)。

SSH 认证的交互过程(时序图)

分工:私钥存在你自己电脑上,绝不外传;公钥上传到 GitHub 保存。认证时 GitHub 拿你登记的公钥,验证你用私钥签的名。

上图说明:GitHub 每次发不同的随机挑战值,本机用私钥签名后回传;GitHub 用登记的公钥验签。全程网络中只有签名在传输,私钥从未离开你的电脑,所以即使被窃听也无法伪造。

什么是"挑战值"?为什么要每次随机?

挑战值 = 服务端每次随机生成的一段数据。随机是为了防止"重放攻击":若每次内容相同,攻击者录下旧回复就能冒充你。

就像银行每次让你念一个随机数字再签名——同一个签名抄不走,因为数字每次都变。

判断在服务端:每次连接换新挑战值,用完即弃,旧签名配不上新题自然失效。


🌱觉得有收获?欢迎交流

这篇文章是我在学习和实践中整理的笔记,希望能帮到你。

如果你在学习过程中遇到任何问题,或者想深入聊某个点,随时私信我——看到都会回复,不用客气。

觉得有用的话,也欢迎点赞 + 收藏 + 关注,这样下次更新你能第一时间看到,也方便我继续输出这类内容 🙌

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进