一句话答案:取决于它是"在你自己的设备上算",还是"把你的密钥发到服务器上算"。
前者,你的密钥从头到尾没离开过这台电脑;后者,你的密钥已经躺在别人的数据库里了。麻烦的是——这两种做法,从页面外观上几乎一模一样,你根本看不出来。这篇文章教你 30 秒分辨它们,也教你怎么当场验证(包括验证本站)。
JBSWY3DPEHPK3PXP 的 Base32 字符串):是永久的。谁拿到它,谁就能随时算出你以后的每一个验证码。所以要害从来不是"验证码有没有被看到",而是——那串密钥有没有被传出去。
做法一:浏览器本地计算(安全)
页面里写好了算法。你输入密钥后,浏览器用自带的加密接口(crypto.subtle)在你自己的设备上算出那 6 位数字。全程没有任何网络请求,密钥不出你这台机器。
做法二:放到服务器上算(有风险)
你把密钥填进去,页面把它 POST 到某台服务器,服务器算好再把结果回给你。这种写法代码更简单,但它意味着——你的密钥存在别人的机器上。 哪怕对方一句"我们只用来统计",密钥也已经不在你手里了。
方法一:断网测试(最直观)
把密钥填进去,等验证码正常跳起来之后——直接关掉WiFi、拔掉网线。如果验证码还在照常跳动,它就是本地算的。如果它立刻卡住、转圈、报错,那它一定在跟服务器通讯。
方法二:看网络请求(F12,最准)
按 F12 打开开发者工具 → 切到 Network(网络) 面板 → 刷新页面 → 开始输入你的密钥。
然后盯着这个面板看:如果在你输入密钥之后,它没有发出任何带着你密钥的请求,那就是本地算的。 如果有请求发出去,点开看看里面装的是什么。
方法三:看源码
页面上右键 → 查看网页源代码 → 搜索 crypto.subtle 或 hmac。算法如果写在页面自己的脚本里,说明它就在你这边跑。
方法四:把它存到本地,断网打开
把页面另存为一个 HTML 文件到桌面,断网,双击打开。能正常算出验证码,就说明它压根不依赖任何服务器。
拿到密钥的人可以:
换句话说:密码 + 密钥 = 账号。
所以别把密钥放在任何你没完全把握的地方:聊天记录、记事本、手机截图、云笔记的公开分享链接……都不行。
crypto.subtle 里的 HMAC-SHA1),在你自己的设备上完成。推荐:
不要:
最后一件事:如果这串密钥不是你自己在账号后台生成的,而是别人给你的,那就尽早去账号设置里重新绑定一次两步验证,换成你自己新生成的密钥。旧的那串在对方手里留多久,你说了不算。
打开在线验证码生成器 →