导语:之前做过一个小我的项目,其中用到了 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 性能的一个根本的应用办法总结。