nodejs 基於時間的動態驗證碼登入、驗證等(離線模式可用)
大家或許都用過網銀,部分銀行有一個動態口令驗證碼,一般為6位數字,其實其原理較為簡單,即銀行方保留了一個Key,同時動態口令生成器的機器中的key與銀行方保持一致,通過OPT等協議演算法生成6位code,其過程很難被逆轉以及破解,因為通過演算法,只要key設定得足夠複雜,那麼驗證碼幾乎不可能被破解,同時基於時間策略,更難破解
準備工作
瞭解原理
- step1 時間範圍(一般為1分鐘) + 有效且複雜的 Key (字串)
- step2 將字串進行hash
- step3 轉換為6位整數
- step4 伺服器與客戶端保持時間與演算法以及key同步一致即可 (時間)
伺服器端生成
通過伺服器獲取動態驗證code,或通過離線加密程式獲取動態驗證code,如動態碼生成機器、加密程式(無法看到加密密碼即可)
const sm3 = require('sm3')
const dateFormat = require('dateformat')
const mobile = req.body.mobile
let start = dateFormat(Date.now(), 'yyyy-mm-dd-HH:MM')
let end = dateFormat(Date.now() + 60000, 'yyyy-mm-dd-HH:MM')
let words = start + mobile + end + "密碼&……*&@..."
const code = GENERATE_SIX_CODE(sm3(words))
return res.json({err: 0, code: code})
上面的時間段誤差允許在1分鐘之內,即驗證碼每分鐘更新一次
離線客戶端驗證(主機應與伺服器保持同步)
如果在docker中部署,需要注意的是,docker中的時間可能與宿主機不一樣,所以需要先同步一下宿主機與docker時間,讓虛擬機器與宿主機時間一致;如果直接安裝於宿主機,則讓宿主機與伺服器時間保持同步即可。
const sm3 = require('sm3')
const dateFormat = require('dateformat')
const code = req.body.code
const mobile = req.body.mobile
const start = dateFormat(Date.now(), 'yyyy-mm-dd-HH:MM')
const end = dateFormat(Date.now() + 60000, 'yyyy-mm-dd-HH:MM')
let words1 = start + mobile + end + "密碼&……*&@..."
User.findOne({mobile}, (err, user) => {
if (user) {
const code1 = GENERATE_SIX_CODE(sm3(words1))
if (code1 === code) {
req.logIn(user, function (err) {
if (err) {
return res.json({err: 1, msg: '登入失敗'})
} else {
return res.json({err: 0})
}
})
}
} else {
return res.json({err: 1})
}
})
以上驗證code一般寫於離線客戶端中,密碼需要與伺服器密碼保持同步
擴充套件使用
當登入有多種許可權的時候,比如管理員、學生、訪客、老師等,我們可以在生成code的時候在密碼中協定,如果是某種角色用謀者密碼來加密,在驗證的時候,我們額外生成多個匹配即可。
函式補充
用來生成6位整數
const murmurhash = require('node-murmurhash')
module.exports = {
GENERATE_SIX_CODE: (str) => {
let allToSix = (num, length) => {
return (new Array(length).join(0) + num).slice(-length)
}
let mhash = murmurhash(str)
if (mhash < 0) mhash = mhash + 4294967296
return allToSix(parseInt(mhash.toString().substr(4)), 6)
},
}
相關推薦
nodejs 基於時間的動態驗證碼登入、驗證等(離線模式可用)
大家或許都用過網銀,部分銀行有一個動態口令驗證碼,一般為6位數字,其實其原理較為簡單,即銀行方保留了一個Key,同時動態口令生成器的機器中的key與銀行方保持一致,通過OPT等協議演算法生成6位code,其過程很難被逆轉以及破解,因為通過演算法,只要key
Python識別圖形驗證碼,實現自動登陸(附視訊教程)
驗證碼有圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、宮格驗證碼。這回重點講講圖形驗證碼的識別。 雖說圖形驗證碼最簡單,但是對於我這等新手,還是要苦學一番。首先尋找測試網站,網站選的是如雲閣小說網,小網站不怕被封。他們的驗證碼一般如下:視訊教程: &n
新聞推薦系統:基於內容的推薦演算法——TFIDF、衰減機制(github java程式碼)
轉自:因為開發了一個新聞推薦系統的模組,在推薦演算法這一塊涉及到了基於內容的推薦演算法(Content-Based Recommendation),於是藉此機會,基於自己看了網上各種資料後對該分類方法的理解,用盡量清晰明瞭的語言,結合演算法和自己開發推薦模組本身,記錄下這些過
驗證碼識別之圖片處理(一些細節處理)
上一篇我們聊到了圖片驗證碼處理的基本流程,已經可以應付絕大多數圖片驗證碼了。 驗證碼識別之圖片處理(基礎流程)------ 連結戳這裡 我們來看一下成果: 可以看到應付我們的學習演算法需求已經足夠。 今天我們來看看一些特殊圖片的處理方法: 1、帶邊框驗證碼:
畫一個乘坐地鐵的流程圖,從購票到搭乘地鐵的過程,包括安檢、購票等(網易-2013)
中轉 人工 路線 提示 但是 情況 -a 公交 四種 (1)安檢 作用:防止乘客攜帶危險物品上車,包括汽油、刀類等,保障公共安全。 需要考慮乘客分類:1)有包的乘客:需要接受安檢。 2)無包的乘客:直接通行,可略過此步驟。當然,特殊時期(警備要求特別高),有時候會對每一個乘
SpringSecurity驗證碼登入整體思路、解決ifram問題
1.1SpringSecurity驗證碼登入整體思路 SpringSecurity沒辦法驗證驗證碼,需要自行編寫Controller,先攔截表單的引數,判斷驗證碼是否正確。正確則將使用者名稱和密碼交給SpringSecurity的Controller去驗證 注意要點:配置
python3爬蟲session處理12306火車票動態圖片驗證碼登入
一、 實現需求 1、 登入12306 使用者名稱與密碼是明碼登入,無需處理 2、 動態圖片驗證碼 是8張動態圖片,圖片很小 可能要選擇圖片中的1—3個不等圖片 3、 查票與購票 要定位到登入url,及要提交的引數 二、 實現原理 1、
【轉】前端驗證碼倒計時、後臺發送驗證碼、創藍短信接口
statistic pla use code arr 是否 fun utf nsf 前端代碼:倒計時 <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"&
Django+Jquery+Ajax+驗證碼登入案例
1,建立專案test04 2,建立應用app為booktest 3,註冊應用booktest 作用讓建立的應用執行起來 4,在專案根目錄下建立模板templates目錄 作用就是存放html檔案 在專案的settings.py檔
驗證碼 登入中應用
url路由: #驗證碼url(r'^v_code/$', views.v_code,name='v_code'), sesting配置: #許可權設定# 1. session設定PERMISSION_SESSION_KEY = 'permissions' #許可權資訊MENU_SESSION_KEY
WEB——驗證碼生成、IO儲存、二進位制傳輸
執行下段程式,瀏覽器訪問127.0.0.1:8000 即可在頁面展現驗證碼 程式碼包含了驗證碼的生成 io儲存 二進位制資料傳輸等知識點 # coding=utf-8 # wsgi_server.py import random import string import base64
python selenium接入打碼平臺破解豆瓣驗證碼登入
from selenium import webdriverimport requestsimport timeimport refrom chaojiying import Chaojiying_Clientfrom selenium.common.exceptions import NoSuchEleme
SpringSecurity(六)簡訊驗證碼登入
由 SpringSecurity(四)認證流程 我們已經知道了Spring Security使用者名稱和密碼的登入流程。仿照使用者名稱和密碼登入編寫一個簡訊驗證碼登入 手機驗證碼登入流程圖 簡訊驗證碼 新建一個SmsCode類
使用requests庫實現驗證碼登入
import requests from bs4 import BeautifulSoup import urllib.request headers = { ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWeb
基於struts+hibernate+ajax的登入註冊驗證與購物車demo解析
本博文主要介紹使用struts完成頁面跳轉和hibernate訪問資料庫的方式,完成簡單的ajax註冊驗證和購物車功能demo例項。將搭建過程和一些心得分享出來。此文為流程分析,並不介紹具體實現過程的每個細節,原始碼放在了下載頁。頁面截圖如下(請忽略頁面醜,只為功能齊全...) 一:struts
圖片驗證碼+前、後端使用
生成圖片驗證碼 1 獲得一個畫布 2 例項化一個畫筆 3 例項化字型 4 使用畫筆 畫對應的字元 5 儲存驗證碼圖片 6 將生成的四個隨機字元 寫入session 留著驗證用 7 將圖片返回給瀏覽器 獲得隨機顏色 ~~~ import random
【SpringSecurity系列】SpringBoot整合SpringSecurity新增驗證碼登入
上一篇博文已經介紹過了SpringSecurity的表單登入,這裡我們基於上一篇的基礎上,新增一個驗證碼進行登入,登入頁面效果圖,如圖所示: 首先我們需要建立驗證碼的生成規則,首先建立一個驗證碼的實體: public class ImageCode { /** 驗證碼 */
手機驗證碼登入
一.導依賴 1.在專案的build.gradle classpath 'com.mob.sdk:MobSDK:+' 2.在app的build.gradle // 新增外掛 apply plugin: 'com.mob.sdk' // 在MobSDK的擴充套件中註
thinkphp5.0 驗證碼登入
第一步按常規的登入寫好H5網頁,再再控制器裡面寫好方法,注意還要在controller資料夾同意目錄下新建一個validate層,在裡面新建一個驗證器,寫你要驗證的規則。下面來看看程式碼: 1、H5,我這個是用的非同步提交表單的,下面有ajax <form meth
Laravel實現小程式使用openid登陸、手機號驗證碼登陸、賬戶密碼登陸三種登陸方式
目前開發小程式,按需求要實現3種登陸方式: 1、微信授權登陸 2、賬戶密碼登陸 3、手機號、驗證碼登陸 我使用laravel自帶的Auth認證機制,通過attempt方法進行賬戶驗證,但是預設的認證機制必須包含password欄位,而我的第1、3種登陸方式都沒有