什么是 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 的对比
| 维度 | PAT | SSH Key |
|---|---|---|
| 协议 | HTTPS | SSH |
| 凭据形式 | 一串文本令牌 | 公钥 + 私钥密钥对 |
| 认证方式 | 出示令牌本身(令牌即凭据) | 只传用私钥算出的签名,私钥本体绝不出门 |
| 有效期 | 可设置,会过期 | 永不过期 |
| 配置难度 | 简单,适合新手 | 稍麻烦,一次搞定 |
💡 共同点:两者都代替密码完成身份验证,权限都可在 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–25 | 000000–011001 | A–Z | 26 |
| 26–51 | 011010–110011 | a–z | 26 |
| 52–61 | 110100–111101 | 0–9 | 10 |
| 62 | 111110 | + | 1 |
| 63 | 111111 | / | 1 |
合计 26 + 26 + 10 + 1 + 1 = 64,正好对应 2⁶ 种组合。末尾用 = 补齐不足的字节。
它的存在是为了解决"传输兼容性"——早期邮件、网页、配置文件只认文字,遇到不可见的控制字节就会出错。把二进制套上一层字母外衣,就能安全穿过这些系统。
图示说明:图片里含 NUL 字节(值 0)时,邮件系统把它当成"消息结束"指令,后面的数据全部截断,收件方只拿到半张图;同样的数据经 Base64 编码后,值 0 被写成字母 A,全部变成没有特殊含义的普通字符,邮件系统原样送达,收件方解码后完整还原。
所以 Base64 的本质是:把可能撞上指令的字节,全部换成安全字符,让数据活着到达。
🔑 公钥敢公开,正因推不出私钥;若能推出,公开公钥即等于公开私钥,体系崩塌。私钥泄露则须立即作废密钥对。
颜料的例子:两桶原色(私钥)搅拌成混合色(公钥),一秒搞定;但从混合色还原原色和比例,全球计算机算到宇宙末日也不行。
钥匙的用途(方向相反,缺一不可):别人用你的公钥把信息锁进箱子,世界上唯一能打开的是你的私钥(保隐私);你用私钥盖的章,别人用公钥能验真(保真实)。
SSH 认证的交互过程(时序图)
分工:私钥存在你自己电脑上,绝不外传;公钥上传到 GitHub 保存。认证时 GitHub 拿你登记的公钥,验证你用私钥签的名。
上图说明:GitHub 每次发不同的随机挑战值,本机用私钥签名后回传;GitHub 用登记的公钥验签。全程网络中只有签名在传输,私钥从未离开你的电脑,所以即使被窃听也无法伪造。
什么是"挑战值"?为什么要每次随机?
挑战值 = 服务端每次随机生成的一段数据。随机是为了防止"重放攻击":若每次内容相同,攻击者录下旧回复就能冒充你。
就像银行每次让你念一个随机数字再签名——同一个签名抄不走,因为数字每次都变。
判断在服务端:每次连接换新挑战值,用完即弃,旧签名配不上新题自然失效。
🌱觉得有收获?欢迎交流
这篇文章是我在学习和实践中整理的笔记,希望能帮到你。
如果你在学习过程中遇到任何问题,或者想深入聊某个点,随时私信我——看到都会回复,不用客气。
觉得有用的话,也欢迎点赞 + 收藏 + 关注,这样下次更新你能第一时间看到,也方便我继续输出这类内容 🙌