导语:之前做过一个小我的项目,其中用到了F2A(双因素认证)进行登录以及其余的用户身份认证,当初就这个性能的原理以及实现做一个总结。

目录

  • F2A原理
  • 实现办法
  • 实战演练

F2A原理

F2A就是双因素认证的缩写,一种采纳工夫同步技术的零碎,采纳了基于工夫、事件和密钥三变量而产生的一次性明码来代替传统的动态明码。

大家都晓得个别网站验证用户身份都是采纳单因素认证,比方:用户名+明码,还有的是手机号+短信验证码。

然而用户+明码的容易被黑客爆破,脱库,撞库进行获取;而短信验证码也容易被伪基站,钓鱼网站,WIFI等伎俩获取到,从而透露用户隐衷信息。

明天介绍的这个F2A就是在应用了上述提到的办法外,再另外加一层防护网,对用户登录进行二次验证,验证码是基于用户密钥独立生成的,随机生存的6位数。

而且是在独立的APP专门设施下面寄存,只有你本人能够查看,而且这个验证码是60秒切换一次,每次都不一样,加大了黑客破解的工夫难度。

实现办法

持续关上上次的demo文件夹,而后创立一个f2a文件夹,写入一个文件index.js

这次要实现的性能包含以下几点:

  • 生成二维码性能;
  • 生成F2A密钥
  • 验证F2A明码

生成二维码性能

这个性能比较简单,装置一个qrcode就能够了。

$ npm install qrcode --save
const express = require('express');const app = express();const qrcode = require('qrcode');app.get('/f2a/qrcode', (req, res) => {    let url = req.query.url;    if (!url) {        return res.json({            code: 101,            msg: 'get_fail',            data: {                info: "url不能为空!"            }        });    }    qrcode.toDataURL(url, (err, data) => {        return res.send('<img src="' + data + '">');    })})

关上游览器,轻易输出一个网址参数,来测试一下。

这里应用百度一下:http://localhost:3000/f2a/qrcode?url=https://www.baidu.com/

这里是预览截图:

生成F2A密钥

接下来就是明天的配角退场,F2A双因素。

先来下载一个依赖包,装置一下引入文件。

$ npm install speakeasy --save

获取F2A

这里次要应用generateSecret来创立F2A密钥信息;

const express = require('express');const app = express();const speakeasy = require('speakeasy');app.get('/f2a', (req, res) => {    let secret = speakeasy.generateSecret({length: 20});    return res.json({        code: 200,        msg: 'get_succ',        data: {            info: '获取胜利',            secret: secret.base32,            url: secret.otpauth_url,        }    });})

其中secret就是你的集体密钥,url就是你的F2A设施要扫描的地址。

接下来在游览器看一下成果。

验证F2A明码

这里次要应用totp.verify办法来验证六位数字是否为正确。

app.post('/f2a', (req, res) => {    let token = req.body.code;    let secret = req.body.secret;    if (!token) {        return res.json({            code: 101,            msg: 'get_fail',            data: {                info: "验证码不能为空!"            }        });    }    if (!(/^\d{6}$/.test(token))) {        return res.json({            code: 101,            msg: 'get_fail',            data: {                info: "验证码格局不正确!"            }        });    }    if (!secret) {        return res.json({            code: 101,            msg: 'get_fail',            data: {                info: "密钥不能为空!"            }        });    }    let verifyInfo = {        secret,        encoding: 'base32',        token,    }    let verify = speakeasy.totp.verify(verifyInfo);    if (verify) {        return res.json({            code: 200,            msg: 'get_succ',            data: {                info: "验证胜利!"            }        });    } else {        return res.json({            code: 101,            msg: 'get_fail',            data: {                info: "验证失败!"            }        });    }})

其实这个依赖包还有个生成随机六位数的办法。

app.get('/code', (req, res) => {    let secret = req.query.secret;    if (!secret) {        return res.json({            code: 101,            msg: 'get_fail',            data: {                info: "密钥不能为空!"            }        });    }    var token = speakeasy.totp({        secret,        encoding: 'base32'    });    return res.json({        code: 200,        msg: 'get_succ',        data: {            info: "获取胜利!",            code: token,        }    });})

关上http://localhost:3000/f2a/code?secret=F44T62DGOJJT66TLH5WGWVBQJ47XUZJO,会呈现一个六位数,这个就是生成的,大概有60秒有限期。

这个code外面的六位数其实和F2A利用的六位数是等效的,一样的,你也能够应用这个办法做一个相似的小程序,扫码绑定,显示六位数,这也是能够的。

实战演练

当初F2A的性能基本上是实现了,然而想要体验一下,你必须筹备好F2A利用才能够。

这里举荐三个比拟罕用F2A利用:

  • authy

  • 微信小程序:二次验证码

有了利用后,

绑定F2A

先关上那个网址,因为是get申请,间接在游览器关上,获取到密钥和地址。

当初曾经进去了,

  • 密钥是secret的值:F44T62DGOJJT66TLH5WGWVBQJ47XUZJO,
  • 地址是url的值:otpauth://totp/SecretKey?secret=F44T62DGOJJT66TLH5WGWVBQJ47XUZJO

接下来有两种办法绑定:

  • 间接在F2A利用输出secret外面;
  • 扫描二维码更不便(省去输出环节);

接下来采纳第二种办法。

在游览器关上http://localhost:3000/f2a/qrcode?url=otpauth://totp/SecretKey?secret=F44T62DGOJJT66TLH5WGWVBQJ47XUZJO,看到一个二维码,应用F2A利用扫描后,胜利绑定。

F2A验证

这次应用postman进行验证,关上postman软件,输出url以及参数。

点击发送按钮,能够如下图,验证胜利。

以上就是应用node实现F2A性能的一个根本的应用办法总结。