一文读懂 GitHub 2FA:TOTP 密钥、验证码与恢复码(含免下载验证源码)
一、第一步申请密钥2FA 双因素认证是多因素认证 (MFA) 的一种。登录需要两类不同凭证除账号密码之外还需要提供一次性验证码两者全部校验通过才可登录账号避免仅密码泄露就被盗号。二、第二步往APP输入密钥此步骤使得APP可以生成正常的登录密码三、第三步保存Github给你的密钥、恢复码记住密钥由Github提供各大【Authenticator】APP通过TOTP公开协议及密钥生成登录密码有了密钥原始账号密码 可以成功登录Github记住恢复码由Github提供若密钥丢失用恢复码登录进入 2FA 设置页手动编辑更换一套全新 TOTP 密钥四、C#实现根据密钥获取登录密码此代码好处是不需要下载任何APP进行认证但是需要你自己记住密钥密钥不记得了就用恢复码重置密钥若双双不记得了向像Github提交忘记密码申请账号找回public static class TotpHelper { /// summary /// 获取TOTP三组验证码 距离下一次刷新剩余秒数GitHub适用 /// /summary /// param namebase32SecretGitHub的base32密钥/param /// returnsprev,current,next,remainSeconds/returns public static TOTPDetailsDto GetTotpWindowCodes(string base32Secret) { byte[] key Base32Decode(base32Secret); long unixTime DateTimeOffset.UtcNow.ToUnixTimeSeconds(); long counter unixTime / 30; //计算距离下一轮刷新剩余秒数 int remainSeconds 30 - (int)(unixTime % 30); var prev ComputeTotpCode(key, counter - 1); var current ComputeTotpCode(key, counter); var next ComputeTotpCode(key, counter 1); return new TOTPDetailsDto { PrePWD prev, CurrentPDW current, NextPDW next, RemainTime remainSeconds }; } /// summary /// 根据counter计算单组TOTP /// /summary private static string ComputeTotpCode(byte[] key, long counter) { byte[] counterBytes BitConverter.GetBytes(counter); if (BitConverter.IsLittleEndian) Array.Reverse(counterBytes); using var hmac new HMACSHA1(key); byte[] hash hmac.ComputeHash(counterBytes); int offset hash[hash.Length - 1] 0x0F; int binary ((hash[offset] 0x7F) 24) | ((hash[offset 1] 0xFF) 16) | ((hash[offset 2] 0xFF) 8) | (hash[offset 3] 0xFF); int code binary % 1000000; return code.ToString(D6); // D6 保证6位前面补0 } /// summary /// RFC4648 Base32解码谷歌Authenticator / GitHub TOTP专用 /// /summary private static byte[] Base32Decode(string input) { const string alphabet ABCDEFGHIJKLMNOPQRSTUVWXYZ234567; if (string.IsNullOrEmpty(input)) throw new ArgumentNullException(nameof(input)); input input.ToUpperInvariant().Replace(, ); int bitCount input.Length * 5; byte[] output new byte[(bitCount 7) / 8]; int bitPos 0; foreach (char c in input) { int val alphabet.IndexOf(c); if (val 0) throw new FormatException($非法Base32字符{c}); for (int i 4; i 0; i--) { if ((val (1 i)) ! 0) { int byteIndex bitPos / 8; int bitIndex 7 - (bitPos % 8); output[byteIndex] | (byte)(1 bitIndex); } bitPos; } } return output; } public class TOTPDetailsDto { /// summary /// 上一个密码 /// /summary public string PrePWD { get; set; } string.Empty; /// summary /// 当前密码 /// /summary public string CurrentPDW { get; set; } string.Empty; /// summary /// 下一个密码 /// /summary public string NextPDW { get; set; } string.Empty; /// summary /// 当前密码剩余时间s /// /summary public int RemainTime { get; set; } } } class Program { /// summary /// 生成TOTP规范随机Base32密钥仅本地测试 /// /summary public static string CreateRandomBase32Secret(int length 16) { const string base32Alphabet ABCDEFGHIJKLMNOPQRSTUVWXYZ234567; Random random new Random(); char[] result new char[length]; for (int i 0; i length; i) { result[i] base32Alphabet[random.Next(base32Alphabet.Length)]; } return new string(result); } static async Task Main() { // 这里替换为你GitHub的手动设置密钥(Base32) //调用示例 string githubBase32Secret CreateRandomBase32Secret(); githubBase32Secret $2WUYW6CXWYETD6KK;//固定测试密钥 Console.WriteLine(密钥githubBase32Secret); var res TotpHelper.GetTotpWindowCodes(githubBase32Secret); Console.WriteLine($上一窗口验证码:{res.PrePWD}); Console.WriteLine($【当前窗口验证码】:{res.CurrentPDW}(剩余时间是:{res.RemainTime}s)); Console.WriteLine($下一窗口验证码:{res.NextPDW}); Console.WriteLine(按任意键退出); Console.ReadKey(); } }五、好用工具推荐1.在线网站好处是方便坏处是清理缓存丢密钥需要自己保存密钥网址是https://totp.app/Online one-time password generator / TOTP (Google Authenticator) Online / 2FA2.在线App工具使用苹果手机下载微软官方的Microsoft AuthenticatorApp3.在线电脑工具下载使用我开发的工具EasyAuthenticator链接步骤1.点击获取密钥2.在EasyAuthenticator设置密钥并且保存好密钥3.输入首个密钥4.保存你的恢复码5.大功告成

相关新闻

Java运算符深度解析:从逻辑短路到位运算实战应用

Java运算符深度解析:从逻辑短路到位运算实战应用

1. 从一次线上故障说起:一个被忽略的“|”去年,团队里一个刚转Java不久的同事写了一段权限校验的代码,大致逻辑是检查用户是否拥有“管理员”或“超级用户”权限之一。代码看起来很简单:if (user.hasRole("admin") | us…

2026/10/24 15:09:35 阅读更多 →
深入解析SpringMVC请求处理流程:从DispatcherServlet到视图渲染

深入解析SpringMVC请求处理流程:从DispatcherServlet到视图渲染

1. 从一次诡异的404说起:为什么必须搞懂SpringMVC流程 那天下午,我正对着屏幕发呆,一个刚入行的同事跑过来,脸上写满了困惑:“哥,我明明在Controller里写了 RequestMapping(“/user”) ,浏览器…

2026/10/24 23:59:01 阅读更多 →
科研必备:JCR与ISO 4期刊缩写标准详解与实用合辑构建指南

科研必备:JCR与ISO 4期刊缩写标准详解与实用合辑构建指南

1. 项目缘起:为什么我们需要一个“期刊缩写合辑”?如果你经常写论文、做文献综述,或者需要处理大量的参考文献,那你一定对期刊缩写这件事不陌生。无论是投稿时填写期刊信息,还是用EndNote、Zotero等文献管理软件整理参…

2026/10/24 3:53:15 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →