一、背景資料
1、1MD5加密技術(shù)的介紹
MD5的全稱是message-digest algorithm5(信息-摘要算法),在90年代初由mitlaboratory for computer science和rsa data security inc的ronaldl_rivest開發(fā)出來,經(jīng)MD2、MD3和MD4發(fā)展而來,它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密匙前被\"壓縮\"成一種保密的格式,即把一個任意長度的字節(jié)串變換成一定長的大整數(shù)信息摘要(message-digest),以防止被篡改。對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。由于MD5算法的使用不需要支付任何版權(quán)費用的,且不能通過逆向算法得到明文,此加密算法已被廣泛應(yīng)用于加密、解密以及數(shù)字簽名技術(shù)中。
2、驗證碼簡介
驗證碼(CAPTCHA)是\"Completely Automated Public Turing test to tell Computers and Humans Apart\"(全自動區(qū)分計算機和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計算機還是人的公共全自動程序??梢苑乐梗簮阂馄平饷艽a、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現(xiàn)在很多網(wǎng)站通行的方式(比如招商銀行的網(wǎng)上個人銀行,百度社區(qū)),我們利用比較簡易的方式實現(xiàn)了這個功能。
3、國內(nèi)外研究現(xiàn)狀
談到驗證,便立即聯(lián)想到驗證碼,但如何生成驗證碼,對于軟件的設(shè)計者是一個十分關(guān)鍵的問題。通常而言,常見的驗證碼幾種形式:(1)CSDN網(wǎng)站用戶登錄用的是GIF格式,目前常用的隨機數(shù)字圖片驗證碼。圖片上的字符比較中規(guī)中矩,驗證作用比上一個好。沒有基本圖形圖像學(xué)知識的人,不可破。(2)MS的hot-mail申請時候的是BMP格式,隨機數(shù)字+隨機大寫英文字母+隨機干擾像素+隨機位置。(3)四位數(shù)字和字母,可能都是字母,也可能都是數(shù)字,隨機的4位字符串,最原始的驗證碼,驗證作用幾乎為零。(4)韓文或日文,現(xiàn)在跑跑HF上MS注冊都要打韓文的,這更增加了難度,要去修學(xué)下才行。(5)Google的G-mail注冊時候的是JPG格式,隨機英文字母+隨機顏色+隨機位置+隨機長度。(6)其他各大論壇的是XBM格式,內(nèi)容隨機。(7)廣告驗證碼:輸入廣告中的部分內(nèi)容即可,特點是可以給網(wǎng)站帶來額外收入,也可以使使用者耳目一新。(8)問題驗證碼:問題驗證碼主要是以問答式的形式來進行填寫。(9)短信驗證碼利用短信驗證碼來注冊會員,大大降低了非法注冊,爛注冊的數(shù)據(jù)。本文主要討論第三種方式的實現(xiàn)。
二、驗證碼的設(shè)計與實現(xiàn)
1、設(shè)計思想
短信驗證碼接口實現(xiàn)通常以如下方式:以速達移動的短信接口為例,一般支持http和webservice調(diào)用。程序員在需要發(fā)送短信的地方添加接口地址和相關(guān)參數(shù),如接收端手機號碼、接收的內(nèi)容以及其他接口參數(shù),調(diào)用完就會返回xml數(shù)據(jù),表示成功提交或者失敗。關(guān)于回復(fù)短信,會綁定到一個接收回復(fù)內(nèi)容的地址,有短信回復(fù)過來就推送到對應(yīng)地址。
為了設(shè)計出一種較好安全的驗證碼,需要了解一下驗證碼的特性。首先,驗證碼要有隨機性,即驗證碼每一次生成的都不一樣。其次,驗證碼需要有模糊性,驗證碼對于人類用戶而言是可辨認(rèn),對于人工智能計算機用戶而言無法辨識,即達到圖靈測試的目的。再次,驗證碼要有保密性,即不易被他人破解。
基于驗證碼的這些特點,所用的設(shè)計思路是:(1)通過獲取當(dāng)前時間片信息得到相對唯一的標(biāo)記碼(在具體實現(xiàn)過程中表現(xiàn)為隨機數(shù)種子);(2)采用MD5加密技術(shù),將由標(biāo)記碼生成的隨機數(shù)字添加干擾信息生成驗證碼。
2、獲取當(dāng)前時間片信息
本文采集計當(dāng)前時間片信息是由系統(tǒng)當(dāng)前的時間片組成,具有唯一性,防止在生成過程中因為時間變化導(dǎo)致隨機數(shù)和驗證碼校驗失敗,選擇最小時間片單位為分鐘。下面是部分代碼:
Int seed = currentTime.Year + currentTime.Month + currentTime.Day + currentTime.Hour + currentTime.Minute;//獲得系統(tǒng)時間,作為生成隨機數(shù)的種子
Stringsb=\"\";//裝載生成的隨機數(shù)
Random random=new Random(seed);//調(diào)用種子生成隨機數(shù)
String rn=\"0123456789\";
for(inti=0;i<20;i++)
{
sb+=rn.Substring((random.Next(rn.Length)),1);
}
string Encrypt_PWD = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s + sb, \"MD5\");
3、驗證碼的實現(xiàn)
將時間片信息用公開的MD5加密算法進行加密,即可得到驗證碼。采用VS2012里面的.Ashx類型文件制作的驗證碼并嵌入到相應(yīng)的頁面,如圖所示。因為此方法選擇的時間片基本單位為分鐘,在人類的有效反應(yīng)時間內(nèi),故也可應(yīng)用在動態(tài)驗證過程中。驗證碼隨機字符串生成的部分代碼:
private string GenerateCheckCode(HttpContext context)
{
int number;
char code;
string checkCode = String.Empty;
System.Random random = new Random();
for (int i = 0; i < 6; i++)
{
number = random.Next();
if (number % 2 == 0)
code = (char)('0' + (char)(number % 10));
else if (number % 3 == 0)
code = (char)('A' + (char)(number % 26));
else
code = (char)('a' + (char)(number % 26));
checkCode += code.ToString();
}
context.Response.Cookies.Add(new HttpCookie(\"CheckCode\", checkCode)); return checkCode;
}
三、驗證碼反破解策略的研究
1、驗證碼的破解
使用php破解驗證碼,只有一種方法,就是收集驗證碼里出現(xiàn)字符的特征碼,然后想辦法分離出驗證碼里的字符。什么人工智能,顯然是php做不到的,所以,只要能收集齊驗證碼里出現(xiàn)字符的特征碼,又能找到方法分離出驗證碼里的字符,就可以破解。
例如圖中,左側(cè)為原字符,右側(cè)為添加干擾信息后的字符,將兩幅圖進行異或運算得到下方點陣,點陣中白點越多字符的匹配度越高。利用此種方式就能進行驗證碼的猜測破解。
2、反破解策略
反破解的思路也主要是圍繞這兩步,使用更多的字符,比如使用中文,使用更多的字體和變形,使得同一個字符有多個特征碼,或者沒有固定的特征碼。增加分離字符的難度,字符出現(xiàn)在驗證碼中的位置不固定,大小不固定,間距不固定,干擾像素要能起到作用。故可以采用下面的方(下轉(zhuǎn)第80頁)(上接第58頁)式添加干擾信息。
為生成的隨機碼添加干擾信息
本文采用的干擾信息添加主要分為畫圖片的清空圖片背景色、背景噪音線、畫圖片的前景噪音點、畫圖片的邊框線。下面是部分代碼:
private void CreateCheckCodeImage(string checkCode, HttpContext context)
{
if (checkCode == 1 || checkCode.Trim() == String.Empty)
return;
System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成隨機生成器
Random random = new Random(Encrypt_PWD);
//清空圖片背景色
g.Clear(Color.White);
//畫圖片的背景噪音線
for (int i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new System.Drawing.Font(\"Arial\", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(checkCode, font, brush, 2, 2);
//畫圖片的前景噪音點
for (int i = 0; i < 100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//畫圖片的邊框線
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.ClearContent();
context.Response.ContentType = \"image/Gif\";
context.Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
效果如下圖:
四、結(jié)語
本文討論的是一種動/靜態(tài)驗證碼的實現(xiàn),即以獲取系統(tǒng)當(dāng)前時間片信息,以MD5為加密算法控制隨機字符串生成,添加適度干擾信息最終生成驗證碼。并在Windows7系統(tǒng)中測試通過。該注冊碼具有如下特點:
(1)通過WindowsAPI函數(shù)currentTime()和WebControls()提取系統(tǒng)當(dāng)前時間片信息,所以能保證驗證碼生成的唯一性、特定性;
(2)由于驗證信息具有唯一性,實現(xiàn)了“一次一碼”的要求,控制時間片信息精度,避免了因驗證超時失效的情況;
(3)該方法稍加修改并嵌入加入了改良過的干擾信息,使得猜測破解方式難度更大,使驗證碼更符合圖靈測試所達到的要求。
(作者單位:青島科技大學(xué)信息科學(xué)技術(shù)學(xué)院)