1. 程式人生 > >nodejs 基於時間的動態驗證碼登入、驗證等(離線模式可用)

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種登陸方式都沒有