本發(fā)明涉及驗(yàn)證碼技術(shù)領(lǐng)域,尤其涉及一種基于緩存的驗(yàn)證碼校驗(yàn)方法和系統(tǒng)。
背景技術(shù):
軟件系統(tǒng)為了方式被惡意破解或者阻擋自動化工具對系統(tǒng)產(chǎn)生的壓力,往往會加入驗(yàn)證碼機(jī)制。
目前,采用的驗(yàn)證碼大多為圖文驗(yàn)證碼,其使用過程為:服務(wù)器將隨機(jī)產(chǎn)生的驗(yàn)證碼明文部分存儲在session(在計算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,session稱為“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當(dāng)用戶在應(yīng)用程序的Web頁之間跳轉(zhuǎn)時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去)當(dāng)中,同時利用明文對其進(jìn)行字符的旋轉(zhuǎn)、扭曲、加入干擾線等方式生成一張圖片,對于圖片中的明文部分,需要通過人工閱讀并手動輸入到制定位置。當(dāng)用戶輸入的明文被提交到服務(wù)器中后,服務(wù)器會將事先存入session中的明文與用戶輸入的明文進(jìn)行比對,如若一致,則認(rèn)為該請求由真正的用戶產(chǎn)生,可以進(jìn)行后續(xù)邏輯,反之則認(rèn)為是非法請求,不予執(zhí)行后續(xù)邏輯??傊F(xiàn)有的實(shí)現(xiàn)方案是將明文存儲在session當(dāng)中,當(dāng)session錯亂時,驗(yàn)證碼無法正確判別。
在中等規(guī)模(若干臺服務(wù)器)的軟件產(chǎn)品中,使用上述驗(yàn)證碼機(jī)制,存在如下兩種方法:
由于用戶請求驗(yàn)證碼和校驗(yàn)驗(yàn)證碼的請求有可能被分配到不同的服務(wù)器中,所以可以將若干臺服務(wù)器之間進(jìn)行session的同步,以便無論后續(xù)請求由哪一臺服務(wù)器提供服務(wù)都能正確從session中讀取到之前生成的驗(yàn)證碼明文并與用戶提交的明文進(jìn)行比對。原理可參見圖1所示。而這種方法存在如下問題:在若干臺服務(wù)器之間進(jìn)行session的同步,會導(dǎo)致系統(tǒng)資源額外的開銷,進(jìn)而導(dǎo)致系統(tǒng)性能下降,服務(wù)器數(shù)量越多,同步的過程越復(fù)雜,額外的開銷越大,性能下降越顯著。
為了避免上述方法中,需要在服務(wù)器間共享session帶來的系統(tǒng)性能下降的問題,還可以采用Iphash(hash:中文名哈希,一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù))的方法:在網(wǎng)絡(luò)通信中,服務(wù)器和用戶都擁有唯一的地址標(biāo)識(IP地址),服務(wù)器通過識別用戶的地址標(biāo)識,將其抽象為一個特定的標(biāo)記,凡是擁有相同標(biāo)記的用戶,所有請求將被始終分配到同一臺服務(wù)器中。其原理可參見圖2所示。但是,這種方法存在以下問題:由于用戶來源復(fù)雜,很難通過一個統(tǒng)一的算法將請求壓力其均勻地分布到各個服務(wù)器中。Iphash算法會造成若干服務(wù)器中有的比較空閑,有的比較繁忙,沒有發(fā)揮出所有服務(wù)器的性能,造成浪費(fèi)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種基于緩存的驗(yàn)證碼校驗(yàn)方法和系統(tǒng),從而解決現(xiàn)有技術(shù)中存在的前述問題。
為了實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下:
一種基于緩存的驗(yàn)證碼校驗(yàn)方法,包括如下步驟:
S1,客戶端向驗(yàn)證碼服務(wù)器系統(tǒng)請求生成驗(yàn)證碼,驗(yàn)證碼服務(wù)器系統(tǒng)包括多個驗(yàn)證碼服務(wù)器,任意一個驗(yàn)證碼服務(wù)器接受請求,生成并向所述客戶端返回加密字符串,并將動態(tài)生成的數(shù)據(jù)保存至緩存服務(wù)器;
S2,所述客戶端向所述驗(yàn)證碼服務(wù)器系統(tǒng)請求獲取所述加密字符串對應(yīng)的圖片,任意一個驗(yàn)證碼服務(wù)器接受請求,對所述加密字符串進(jìn)行解密,獲取原始驗(yàn)證碼內(nèi)容和原始請求時間;
S3,判斷所述原始請求時間與當(dāng)前時間的距離是否超過緩存服務(wù)器中設(shè)置的驗(yàn)證碼有效期,如果是,則不返回任何內(nèi)容,否則,跳至S4;
S4,在緩存服務(wù)器的圖片黑名單中查詢所述加密字符串是否請求過驗(yàn)證碼圖片,如果是,則不返回任何內(nèi)容,否則,生成并向所述客戶端返回所述加密字符串對應(yīng)的圖片,并將所述加密字符串保存至緩存服務(wù)器的所述圖片黑名單中;
S5,所述客戶端輸入所述加密字符串和所述圖片的驗(yàn)證碼,并向所述驗(yàn)證碼服務(wù)器系統(tǒng)請求校驗(yàn),任意一個驗(yàn)證碼服務(wù)器接受請求,對所述加密字符串進(jìn)行解密,如果解密失敗,則校驗(yàn)失敗,否則,執(zhí)行S6;
S6,在緩存服務(wù)器的驗(yàn)證黑名單中查詢所述加密字符串是否被驗(yàn)證過,如果是,則校驗(yàn)失敗,否則,抽取解密后的數(shù)據(jù),匹配當(dāng)前時間和所述原始請求時間,如果時間尚在有效期內(nèi),則匹配用戶輸入的驗(yàn)證碼和所述原始驗(yàn)證碼內(nèi)容,如果匹配成功,則校驗(yàn)成功,否則,校驗(yàn)失敗。
優(yōu)選地,S6之后還包括步驟,無論匹配是否成功,都將所述加密字符串放入緩存服務(wù)器的所述驗(yàn)證黑名單中。
優(yōu)選地,所述圖片黑名單和所述驗(yàn)證黑名單中的緩存服務(wù)器有效期長于所述驗(yàn)證碼有效期。
優(yōu)選地,所述加密字符串的格式為:[驗(yàn)證碼]_[時間戳]_[隨機(jī)數(shù)]。
優(yōu)選地,所述驗(yàn)證碼的寬度根據(jù)配置設(shè)置,字符空間是阿拉伯?dāng)?shù)字和英文大小寫,所述時間戳為所述加密字符串的生成時間距離1970年1月1日0時的毫秒數(shù)。
優(yōu)選地,S4中,所述生成所述加密字符串對應(yīng)的圖片,具體為,采用開放源代碼的kaptcha驗(yàn)證碼生成組件。
優(yōu)選地,S1中,所述生成加密字符串,具體為,采用XXTEA的加密算法,并在加密之后進(jìn)行Base64編碼。
一種基于緩存的驗(yàn)證碼校驗(yàn)系統(tǒng),包括:
客戶端,用于向驗(yàn)證碼服務(wù)器系統(tǒng)請求生成驗(yàn)證碼、獲取所述加密字符串對應(yīng)的圖片、輸入所述加密字符串和所述圖片的驗(yàn)證碼以及向所述驗(yàn)證碼服務(wù)器系統(tǒng)請求校驗(yàn)驗(yàn)證碼;
驗(yàn)證碼服務(wù)器系統(tǒng),包括多個驗(yàn)證碼服務(wù)器,且每個驗(yàn)證碼服務(wù)器的功能相同,均用于接受所述客戶端請求,并用于執(zhí)行以下操作:生成并向所述客戶端返回加密字符串,并將動態(tài)生成的數(shù)據(jù)保存至緩存服務(wù)器;對所述加密字符串進(jìn)行解密,獲取原始驗(yàn)證碼內(nèi)容和原始請求時間;判斷所述原始請求時間與當(dāng)前時間的距離是否超過緩存服務(wù)器中設(shè)置的驗(yàn)證碼有效期;在緩存服務(wù)器的圖片黑名單中查詢所述加密字符串是否請求過驗(yàn)證碼圖片,生成并向所述客戶端返回所述加密字符串對應(yīng)的圖片,并將所述加密字符串保存至緩存服務(wù)器的所述圖片黑名單中;在緩存服務(wù)器的驗(yàn)證黑名單中查詢所述加密字符串是否被驗(yàn)證過,抽取解密后的數(shù)據(jù),匹配當(dāng)前時間和所述原始請求時間,如果時間尚在有效期內(nèi),則匹配用戶輸入的驗(yàn)證碼和所述原始驗(yàn)證碼內(nèi)容;
緩存服務(wù)器,與所述驗(yàn)證碼服務(wù)器系統(tǒng)中的每個驗(yàn)證碼服務(wù)器數(shù)據(jù)連接,用于每個驗(yàn)證碼服務(wù)器的數(shù)據(jù)存儲和調(diào)用。
本發(fā)明的有益效果是:本發(fā)明實(shí)施例提供了一種基于緩存的驗(yàn)證碼校驗(yàn)方法和系統(tǒng),通過將多個驗(yàn)證碼服務(wù)器分別與緩存服務(wù)器數(shù)據(jù)連接,實(shí)現(xiàn)了多個驗(yàn)證碼服務(wù)器之間可以通過緩存服務(wù)器發(fā)生數(shù)據(jù)交互,從而,對于包括多個驗(yàn)證碼服務(wù)器的系統(tǒng)而言,客戶端請求生成字符串、驗(yàn)證碼圖片和校驗(yàn)等過程,均可以隨機(jī)由任意一個驗(yàn)證碼服務(wù)器來執(zhí)行,無需在多個驗(yàn)證碼服務(wù)器之間共享session,在增加驗(yàn)證碼服務(wù)器提供服務(wù)的同時,不會顯著增加額外的網(wǎng)絡(luò)開銷,而且可以與其他系統(tǒng)配合,將客戶端的請求均勻的分布到各個驗(yàn)證碼服務(wù)器中,不會造成驗(yàn)證碼服務(wù)器過忙或過閑的情況,實(shí)現(xiàn)資源的充分利用。
附圖說明
圖1是多個驗(yàn)證碼服務(wù)器之間共享session的工作原理示意圖;
圖2是請求和校驗(yàn)均分配到同一臺驗(yàn)證碼服務(wù)器中的工作原理示意圖;
圖3是本發(fā)明提供的基于緩存的驗(yàn)證碼校驗(yàn)工作原理示意圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施方式僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
實(shí)施例一
如圖3所示,本發(fā)明實(shí)施例提供了一種基于緩存的驗(yàn)證碼校驗(yàn)方法,包括如下步驟:
S1,客戶端向驗(yàn)證碼服務(wù)器系統(tǒng)請求生成驗(yàn)證碼,驗(yàn)證碼服務(wù)器系統(tǒng)包括多個驗(yàn)證碼服務(wù)器,任意一個驗(yàn)證碼服務(wù)器接受請求,生成并向所述客戶端返回加密字符串,并將動態(tài)生成的數(shù)據(jù)保存至緩存服務(wù)器;
S2,所述客戶端向所述驗(yàn)證碼服務(wù)器系統(tǒng)請求獲取所述加密字符串對應(yīng)的圖片,任意一個驗(yàn)證碼服務(wù)器接受請求,對所述加密字符串進(jìn)行解密,獲取原始驗(yàn)證碼內(nèi)容和原始請求時間;
S3,判斷所述原始請求時間與當(dāng)前時間的距離是否超過緩存服務(wù)器中設(shè)置的驗(yàn)證碼有效期,如果是,則不返回任何內(nèi)容,否則,跳至S4;
S4,在緩存服務(wù)器的圖片黑名單中查詢所述加密字符串是否請求過驗(yàn)證碼圖片,如果是,則不返回任何內(nèi)容,否則,生成并向所述客戶端返回所述加密字符串對應(yīng)的圖片,并將所述加密字符串保存至緩存服務(wù)器的所述圖片黑名單中;
S5,所述客戶端輸入所述加密字符串和所述圖片的驗(yàn)證碼,并向所述驗(yàn)證碼服務(wù)器系統(tǒng)請求校驗(yàn),任意一個驗(yàn)證碼服務(wù)器接受請求,對所述加密字符串進(jìn)行解密,如果解密失敗,則校驗(yàn)失敗,否則,執(zhí)行S6;
S6,在緩存服務(wù)器的驗(yàn)證黑名單中查詢所述加密字符串是否被驗(yàn)證過,如果是,則校驗(yàn)失敗,否則,抽取解密后的數(shù)據(jù),匹配當(dāng)前時間和所述原始請求時間,如果時間尚在有效期內(nèi),則匹配用戶輸入的驗(yàn)證碼和所述原始驗(yàn)證碼內(nèi)容,如果匹配成功,則校驗(yàn)成功,否則,校驗(yàn)失敗。
上述方法與現(xiàn)有技術(shù)相比,可以很好地實(shí)現(xiàn)驗(yàn)證碼脫離session。驗(yàn)證碼服務(wù)器之間不再需要共享session,充分利用每臺驗(yàn)證碼服務(wù)器的資源。另外因?yàn)橐肓撕诿麊魏统瑫r機(jī)制,可以很好地抵御重放攻擊。
在本發(fā)明的一個優(yōu)選實(shí)施例中,S6之后還可以包括步驟,無論匹配是否成功,都將所述加密字符串放入緩存服務(wù)器的所述驗(yàn)證黑名單中。
采用上述方法,可以防止驗(yàn)證碼的再次驗(yàn)證通過,造成不必要的損失。
在本發(fā)明的一個優(yōu)選實(shí)施例中,所述圖片黑名單和所述驗(yàn)證黑名單中的緩存服務(wù)器有效期長于所述驗(yàn)證碼有效期。
其中,驗(yàn)證碼服務(wù)器將動態(tài)生成的數(shù)據(jù)保存至緩存服務(wù)器時,可以將其取哈希作為key,而數(shù)據(jù)結(jié)構(gòu)本身作為value放入到緩存服務(wù)器當(dāng)中,則緩存服務(wù)器中圖片黑名單可以采用key格式為:img_black_hash(token),驗(yàn)證黑名單可以采用key格式為verified_hash(token),兩者的緩存服務(wù)器有效期都要比驗(yàn)證碼有效期明顯長一些,比如,當(dāng)驗(yàn)證碼有效期設(shè)置為30秒時,圖片黑名單和驗(yàn)證黑名單中的緩存服務(wù)器有效期可以設(shè)置為60秒,這樣,當(dāng)下次客戶端再拿加密字符串來請求驗(yàn)證碼圖片時先從圖片黑名單里查找,命中就不返回,即便沒命中,也由于加密字符串中的時間已經(jīng)過了有效期而什么也得不到。
本發(fā)明實(shí)施例中,所述加密字符串的格式可以為:[驗(yàn)證碼]_[時間戳]_[隨機(jī)數(shù)]。
在字符串的后面加入幾位隨機(jī)數(shù),可以避免高并發(fā)下發(fā)生重復(fù)。
其中,所述驗(yàn)證碼的寬度根據(jù)配置設(shè)置,字符空間是阿拉伯?dāng)?shù)字和英文大小寫,所述時間戳為所述加密字符串的生成時間距離1970年1月1日0時的毫秒數(shù)。
其中,驗(yàn)證碼的寬度可以根據(jù)配置進(jìn)行設(shè)置,可以設(shè)置為4位、5位或者6位,不同字段之間可以通過下劃線進(jìn)行分隔,例如,5Ais_1369930314548_2137。
本實(shí)施例中,S4中,所述生成所述加密字符串對應(yīng)的圖片,具體可以為,采用開放源代碼的kaptcha驗(yàn)證碼生成組件。
使用Java語言可以生成任何形式的圖片,為了方便,本發(fā)明中使用了開放源代碼的kaptcha,在現(xiàn)有技術(shù)中,該組件可以用來生成驗(yàn)證碼,本發(fā)明中僅使用其生成驗(yàn)證碼圖片的功能,再加上一些字符旋轉(zhuǎn)代碼。
本發(fā)明實(shí)施例中,S1中,所述生成加密字符串,具體可以為,采用XXTEA的加密算法,并在加密之后進(jìn)行Base64編碼。
XXTEA算法非常簡潔高效,運(yùn)算速度快,是一種實(shí)用的對稱加密算法。本發(fā)明中,為了保證加密后的結(jié)果能以字符串的形式傳輸,在加密之后進(jìn)行了Base64編碼。在解密時將密文先經(jīng)過Base64去編碼,然后再解密。
實(shí)施例二
本發(fā)明實(shí)施例提供了一種基于緩存的驗(yàn)證碼校驗(yàn)系統(tǒng),包括:
客戶端,用于向驗(yàn)證碼服務(wù)器系統(tǒng)請求生成驗(yàn)證碼、獲取所述加密字符串對應(yīng)的圖片、輸入所述加密字符串和所述圖片的驗(yàn)證碼以及向所述驗(yàn)證碼服務(wù)器系統(tǒng)請求校驗(yàn)驗(yàn)證碼;
驗(yàn)證碼服務(wù)器系統(tǒng),包括多個驗(yàn)證碼服務(wù)器,且每個驗(yàn)證碼服務(wù)器的功能相同,均用于接受所述客戶端請求,并用于執(zhí)行以下操作:生成并向所述客戶端返回加密字符串,并將動態(tài)生成的數(shù)據(jù)保存至緩存服務(wù)器;對所述加密字符串進(jìn)行解密,獲取原始驗(yàn)證碼內(nèi)容和原始請求時間;判斷所述原始請求時間與當(dāng)前時間的距離是否超過緩存服務(wù)器中設(shè)置的驗(yàn)證碼有效期;在緩存服務(wù)器的圖片黑名單中查詢所述加密字符串是否請求過驗(yàn)證碼圖片,生成并向所述客戶端返回所述加密字符串對應(yīng)的圖片,并將所述加密字符串保存至緩存服務(wù)器的所述圖片黑名單中;在緩存服務(wù)器的驗(yàn)證黑名單中查詢所述加密字符串是否被驗(yàn)證過,抽取解密后的數(shù)據(jù),匹配當(dāng)前時間和所述原始請求時間,如果時間尚在有效期內(nèi),則匹配用戶輸入的驗(yàn)證碼和所述原始驗(yàn)證碼內(nèi)容;
緩存服務(wù)器,與所述驗(yàn)證碼服務(wù)器系統(tǒng)中的每個驗(yàn)證碼服務(wù)器數(shù)據(jù)連接,用于每個驗(yàn)證碼服務(wù)器的數(shù)據(jù)存儲和調(diào)用。
上述系統(tǒng)的使用過程及其功能可以參見實(shí)施例一中的描述。
通過采用本發(fā)明公開的上述技術(shù)方案,得到了如下有益的效果:本發(fā)明實(shí)施例提供了一種基于緩存的驗(yàn)證碼校驗(yàn)方法和系統(tǒng),通過將多個驗(yàn)證碼服務(wù)器分別與緩存服務(wù)器數(shù)據(jù)連接,實(shí)現(xiàn)了多個驗(yàn)證碼服務(wù)器之間可以通過緩存服務(wù)器發(fā)生數(shù)據(jù)交互,從而,對于包括多個驗(yàn)證碼服務(wù)器的系統(tǒng)而言,客戶端請求生成字符串、驗(yàn)證碼圖片和校驗(yàn)等過程,均可以隨機(jī)由任意一個驗(yàn)證碼服務(wù)器來執(zhí)行,無需在多個驗(yàn)證碼服務(wù)器之間共享session,在增加驗(yàn)證碼服務(wù)器提供服務(wù)的同時,不會顯著增加額外的網(wǎng)絡(luò)開銷,而且可以與其他系統(tǒng)配合,將客戶端的請求均勻的分布到各個驗(yàn)證碼服務(wù)器中,不會造成驗(yàn)證碼服務(wù)器過忙或過閑的情況,實(shí)現(xiàn)資源的充分利用。
本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個實(shí)施例之間相同相似的部分互相參見即可。
本領(lǐng)域人員應(yīng)該理解的是,上述實(shí)施例提供的方法步驟的時序可根據(jù)實(shí)際情況進(jìn)行適應(yīng)性調(diào)整,也可根據(jù)實(shí)際情況并發(fā)進(jìn)行。
上述實(shí)施例涉及的方法中的全部或部分步驟可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲于計算機(jī)設(shè)備可讀取的存儲介質(zhì)中,用于執(zhí)行上述各實(shí)施例方法所述的全部或部分步驟。所述計算機(jī)設(shè)備,例如:個人計算機(jī)、服務(wù)器、網(wǎng)絡(luò)設(shè)備、智能移動終端、智能家居設(shè)備、穿戴式智能設(shè)備、車載智能設(shè)備等;所述的存儲介質(zhì),例如:RAM、ROM、磁碟、磁帶、光盤、閃存、U盤、移動硬盤、存儲卡、記憶棒、網(wǎng)絡(luò)服務(wù)器存儲、網(wǎng)絡(luò)云存儲等。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實(shí)體或者操作與另一個實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視本發(fā)明的保護(hù)范圍。