摘 要:隨著互聯網的迅速發展,隨之而來的信息安全問題也日益突出。許多網站設計者在安全性上考慮不周全,導致網站安全事故頻發,嚴重影響了網站的正常運行,帶來了巨大的經濟損失。論文探討如何設計和實現基于Java Web環境下的中文驗證碼,旨在為此安全問題提供一種解決途徑。
關鍵詞:驗證碼;隨機;安全
中圖分類號:TP311.10 文獻標識碼:A 文章編號:1674-7712 (2014) 10-0000-01
一、驗證碼
驗證碼(CAPTCHA:Completely Automated Public Turing test to tell Computers and Humans Apart)最早由卡內基梅隆大學的Luis von Ahn、Manuel Blum、Nicholas J.Hopper以及IBM的John Langford于2002年提出。它是一種區分用戶角色,確認是否是人的公共全自動程序。
(一)驗證碼的作用
使用驗證碼可以防止有人利用廣告軟件散發垃圾信息,避免密碼被黑客暴力破解,同時,也可以阻止惡意用戶對網站進行重復發帖等。驗證碼能夠有效防止黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,防止惡意破解密碼、刷票、論壇灌水、刷頁。
(二)隨機漢字驗證碼的工作原理
第一步,由服務器端隨機生成的驗證碼字符串。第二步,將生成的驗證碼保存在Web程序的session對象中。第三步,將session中的驗證碼字符串通過算法寫入圖片中,并發送給瀏覽器端并顯示。第四步,用戶根據自己看到的瀏覽器端顯示的圖片驗證碼,輸入相應的驗證碼,然后提交給服務器。第五步,服務器端將用戶輸入提交的字符串和服務器端保存在session對象中的驗證碼字符串進行比較,若相同,則授權繼續執行下面的代碼段,從而完成后續操作,否則就組織程序使用后繼功能。用戶每次請求時,系統都會產生不同的字符串驗證碼,使得攻擊者無法從瀏覽器端快速提取驗證碼信息,也很難用程序識別驗證碼,難以猜測其具體內容 這樣就實現了辨別用戶身份,阻擋攻擊的目標。
二、基于Java Web的中文驗證碼碼的實現
(一)實現過程
首先,通過程序隨機生成規定字符數量的一級簡碼漢字,區碼在16- 55之間,位碼在1- 93之間,接下來將此漢字區位碼生成對應的漢字,然后將生成的漢字通過算法進行扭曲,之后將文字字符寫入預先構建的圖片中添加干擾元素,之后輸出到客戶端。實現過程如圖1所示。
(二)主要程序文件
主要文件包括index.jsp、code.jsp和YanZheng.java等,它們之間的關系如圖2所示。
三、實現中文驗證碼
(一)生成漢字區位碼的核心代碼
public String getWordCode(int wordNum) {
int i = 1;
int j = 0;
Random random = new Random(System.currentTimeMillis());
int wordCodeByteNum = wordNum * 2;
int wordCodeArr[] = new int[wordCodeByteNum];
int wordHighByteScope = 55;
while (j < wordCodeByteNum) {
i = random.nextInt(wordHighByteScope);
while (true) {
if (i < 16) {
i = random.nextInt(wordHighByteScope);
} else {
break;
}
wordCodeArr[j] = i;
j += 2;
}
}
wordHighByteScope = 93;
j = 1;
while (j < wordCodeByteNum) {
i = random.nextInt(wordHighByteScope);
while (true) {
if (i < 16) {
i = random.nextInt(wordHighByteScope);
} else {
break;
}
wordCodeArr[j] = i;
j += 2;
}
}
String wordCode = new String();
for (i = 0; i < wordCodeByteNum; i++) {
wordCode += wordCodeArr[i];
}
return wordCode;
}
(二)將區位碼轉換漢字的核心代碼
public String getChineseByCode(int wordNum) {
String chineseChar = \"\";
String code = this.getWordCode(wordNum);
for (int i = 0; i < code.length(); i += 4) {
byte[] bs = new byte[2];
String lowCode = code.substring(i, i + 2) ;
int tempLow = Integer.parseInt(lowCode);
tempLow += 160;
bs[0] = (byte)tempLow;
String highCode = code.substring(i +2, i + 4);
int tempHigh = Integer.parseInt(highCode);
tempHigh += 160;
bs[1] = (byte) tempHigh;
String chars = new String(bs);
chineseChar += chars;
}
return chineseChar;
}
(三)將漢字生成圖片的核心代碼
public BufferedImage getTwistGraphics(int wordNum, int fontSize, String randChar){
int imageWidth = fontSize * wordNum + 10;
int imageHeight = fontSize + 20;
BufferedImage bi=
new BufferedImage(imageWidth+20,imageHeight, BufferedImage.TYPE_BYTE_INDEXED);
Graphics graphics = bi.createGraphics();
graphics.setColor(new Color(255, 255, 255));
graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight());
graphics.setFont(new Font(\"黑體\", Font.BOLD, fontSize));
graphics.setColor(this.getRandClolr());
String randChineseChar = this.getChineseByCode(wordNum);
graphics.drawString(randChineseChar, 10, fontSize + 5);
//扭曲圖片
int w = bi.getWidth();
int h = bi.getHeight();
graphics = shearGraphics(graphics, w, h, Color.white);
//干擾點
graphics.setColor(this.getRandClolr());
for (int i = 0; i < imageWidth * imageHeight / 5; i++) {
graphics.fill3DRect(10+generator.nextInt(imageWidth), generator.nextInt(imageHeight), 1, 1, true);
}
return bi;
}
}
四、結束語
通過生成一種帶干擾元素的隨機漢字扭曲驗證碼,安裝配置到網站服務器上,通過一種識別算法,對驗證碼進行有效地識別。這樣可以進一步防止網站被惡意程序進行自動注冊、發帖等攻擊,提高網站安全性、穩定性,減少網站維護成本,為企業運行提供更有力的技術保證。
參考文獻:
[1]常祖政,盧曉倩.Java Web中隨機漢字扭曲驗證碼的實現[J].2010(10).
[2]黃賽平,許明.驗證碼的識別與改進南京師范大學學報[J].工程技術版,2009(07).
[3]李英杰,王偉.基于web的圖像驗證碼技術的研究與實現[J].安徽地震局,2013(09).
[4]陳占芳,馮欣,張偉.隨機中文漢字驗證碼的生產及其應[J].用電腦知識與技術,2007.
[作者簡介]劉明明(1990-),男,貴州遵義,西安文理學院,理學學士。
基金項目:本文系2013年西安文理學院校級大學生創新創業訓練計劃項目(項目編號:2013119)。