最近滑動驗證碼在很多網(wǎng)站逐步流行起來,一方面對用戶體驗來說,比較新穎,操作簡單,另一方面相對圖形驗證碼來說,安全性并沒有很大的降低。當(dāng)然到目前為止,沒有絕對的安全驗證,只是不斷增加攻擊者的繞過成本。
接下來分析下滑動驗證碼的核心流程:
后端隨機生成摳圖和帶有摳圖陰影的背景圖片,后臺保存隨機摳圖位置坐標(biāo)
前端實現(xiàn)滑動交互,將摳圖拼在摳圖陰影之上,獲取到用戶滑動距離值,比如以下示例
前端將用戶滑動距離值傳入后端,后端校驗誤差是否在容許范圍內(nèi)。
這里單純校驗用戶滑動距離是最基本的校驗,出于更高的安全考慮,可能還會考慮用戶滑動的整個軌跡,用戶在當(dāng)前頁面的訪問行為等。這些可以很復(fù)雜,甚至借助到用戶行為數(shù)據(jù)分析模型,最終的目標(biāo)都是增加非法的模擬和繞過的難度。這些有機會可以再歸納總結(jié)常用到的方法,本文重點集中在如何基于Java來一步步實現(xiàn)滑動驗證碼的生成。
可以看到,滑動圖形驗證碼,重要有兩個圖片組成,摳塊和帶有摳塊陰影的原圖,這里面有兩個重要特性保證被暴力破解的難度:摳塊的形狀隨機和摳塊所在原圖的位置隨機。這樣就可以在有限的圖集中制造出隨機的、無規(guī)律可尋的摳圖和原圖的配對。
用代碼如何從一張大圖中摳出一個有特定隨機形狀的小圖呢?
第一步,先確定一個摳出圖的輪廓,方便后續(xù)真正開始執(zhí)行圖片處理操作
圖片是有像素組成,每個像素點對應(yīng)一種顏色,顏色可以用RGB形式表示,外加一個透明度,把一張圖理解成一個平面圖形,左上角為原點,向右x軸,向下y軸,一個坐標(biāo)值對應(yīng)該位置像素點的顏色,這樣就可以把一張圖轉(zhuǎn)換成一個二維數(shù)組?;谶@個考慮,輪廓也用二維數(shù)組來表示,輪廓內(nèi)元素值為1,輪廓外元素值對應(yīng)0。
這時候就要想這個輪廓形狀怎么生成了。有坐標(biāo)系、有矩形、有圓形,沒錯,用到數(shù)學(xué)的圖形函數(shù)。典型用到一個圓的函數(shù)方程和矩形的邊線的函數(shù),類似:
(x-a)²+(y-b)²=r²中,有三個參數(shù)a、b、r,即圓心坐標(biāo)為(a,b),半徑r。這些將摳圖放在上文描述的坐標(biāo)系上很容易就圖算出來具體的值。
示例代碼如下:
private int[][] getBlockData() { int[][] data = new int[targetLength][targetWidth]; double x2 = targetLength-circleR-2; //隨機生成圓的位置 double h2 = circleR + Math.random() * (targetWidth-3*circleR-r1); double po = circleR*circleR; double xbegin = targetLength-circleR-r1; double ybegin = targetWidth-circleR-r1; for (int i = 0; i < targetLength; i++) { for (int j = 0; j < targetWidth; j++) { //右邊○ double d3 = Math.pow(i - x2,2) + Math.pow(j - h2,2); if (d1 <= po || (j >= ybegin && d2 >= po) || (i >= xbegin && d3 >= po) ) { data[i][j] = 0; } else { data[i][j] = 1; } } } return data; }
網(wǎng)站題目:Java實現(xiàn)滑動驗證碼的示例代碼-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://chinadenli.net/article30/hejpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、外貿(mào)建站、網(wǎng)站改版、網(wǎng)頁設(shè)計公司、搜索引擎優(yōu)化、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)