|
|
本帖最后由 ChenYFan 于 2021-11-3 14:15 编辑
我双手赞同。
首先,我自己经历过这件事情。在学校公共电脑上登陆谷歌账号,退出后没有清理,然后另一位同学也登陆了,直接把我的书签历史甚至密码同步到了他的账号!我当时吓得魂不守舍,后来才意识到谷歌有二步验证这个东西。
谷歌的验证是基于totp,简单点说就是根据一个固定密码和时间生成的临时密码。这不同于手机验证!国内的手机验证私钥是不给的,你必须要保持手机带在身边才能保证登陆。而谷歌给了密钥,这样你只要根据密钥和时间就可以计算(也可以口算),甚至不需要连接网络。所以,谷歌的二步验证可以不用手机!bitwarden
可能有人会抱怨,开二步有啥用。
安全是最主要的原因。但我推荐的一个重要原因是开了这玩意就不要手机邮箱验证了!这对我一个不能带手机的学生党非常有用(
这是一段js计算二步的模块
- import jsSHA from "jssha";
- const totp = (key) => {
- function dec2hex(s) { return (s < 15.5 ? '0' : '') + Math.round(s).toString(16); }
- function hex2dec(s) { return parseInt(s, 16); }
- function base32tohex(base32) {
- var base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
- var bits = "";
- var hex = "";
- for (var i = 0; i < base32.length; i++) {
- var val = base32chars.indexOf(base32.charAt(i).toUpperCase());
- bits += leftpad(val.toString(2), 5, '0');
- }
- for (var i = 0; i + 4 <= bits.length; i += 4) {
- var chunk = bits.substr(i, 4);
- hex = hex + parseInt(chunk, 2).toString(16);
- }
- return hex;
- }
- function leftpad(str, len, pad) {
- if (len + 1 >= str.length) {
- str = Array(len + 1 - str.length).join(pad) + str;
- }
- return str;
- }
- var key = base32tohex(key);
- var epoch = Math.round(new Date().getTime() / 1000.0);
- var time = leftpad(dec2hex(Math.floor(epoch / 30)), 16, '0');
- var shaObj = new jsSHA("SHA-1", "HEX");
- shaObj.setHMACKey(key, "HEX");
- shaObj.update(time);
- var hmac = shaObj.getHMAC("HEX");
- var offset = hex2dec(hmac.substring(hmac.length - 1));
- var otp = (hex2dec(hmac.substr(offset * 2, 8)) & hex2dec('7fffffff')) + '';
- otp = (otp).substr(otp.length - 6, 6);
- return otp
- }
- export default totp
复制代码
我之前也写了一个基于cfworker 密码存储与二步的软件,安全性没有得到可靠的验证,请大佬破解,如果有必要可以开源
https://passlesstest.baipiao1.workers.dev/login
如果想看源代码,请将回复github用户名,我将特邀 |
|