本發明涉及一種基于MD5算法的URL防篡改簽名及驗簽方法。
背景技術:
互聯網上資源的訪問地址都是以URL(Uniform Resource Locator,統一資源定位符)的形式來表示的,即網絡協議://資源地址。但通常情況下URL中傳遞的信息并非只有網絡協議和資源地址,還包括網絡請求的相關參數、標識等。一直以來,針對HTTP協議進行欺騙和攻擊的例子已不勝枚舉,其中對URL進行篡改以達到攻擊目的的方式也以其方法簡單、隨時可用而受到許多攻擊者的喜愛。URL篡改攻擊主要表現在以下幾個方面:
1)非法獲取資源
使用瀏覽器訪問形如“http://www.test.com/file.rar”的URL時,瀏覽器會下載名為file.rar的文件。如果攻擊者更改URL中的文件名稱再次訪問時則會自動下載相應的文件(如果文件存在),在系統存在漏洞時還可能通過此種方式獲取到系統配置資源,如數據庫文件等,風險極大。
2)利用URL語義進行攻擊
利用URL保存和傳遞參數的情況在互聯網網站中普遍存在。如:“http://www.test.com/user.jsp?username=aaa&password=123”,假設本意是修改用戶密碼,如果攻擊者將password字段修改為456,當系統設計不嚴謹時,用戶aaa的密碼可以輕松地被攻擊者修改。
3)SQL語句注入攻擊
攻擊者可能會利用精心構造的SQL語句來繞過系統的驗證,從而非法獲取資源或權限。如一個登錄驗證模塊使用“http://www.test.com/login.jsp?username=aaa&password=123”來傳遞信息,后臺生成sq1為“select*from t-user where username=aaa and password=123”,假設程序存在漏洞,攻擊者構造的URL為“http://www.test.com/login.jsp?username=aaa&password=123or 1=1”,此時后臺的SQL變為“select*from t-user where username=aaa and password=123or 1=1”查詢條件恒成立,可直接登錄。
以上三種攻擊都是由于URL可見可篡改造成的,為避免URL被篡改帶來的風險,目前已經有一些技術能夠對URL進行簽名進行防篡改,主要是使用URL上的特定參數作為待加密字符串S1,通過加密算法將待加密字符串生成加密簽名sign,然后建立sign與URL對應的Hash表,訪問時通過sign找到原網址URL,進行鏈接還原與跳轉;或者是將sign簽名附加到URL后,解析時對sign進行校驗,從而判定URL是否被篡改。
現有技術的缺點如下:
1)待加密字符S1的組合依賴于系統用戶及時間戳,適用范圍受限。將原目標URL+頁面地址+用戶ID+時間戳(或隨機數)組合生成待加密字符S1的方式受限于系統業務領域,對于直接外鏈分享內容的方式并不適用(沒有直接受眾用戶信息)。
2)驗簽依賴于web端服務器存儲的簽名信息。不少流行技術中將URL源地址與簽名sign對應關系(Hash表)存儲至服務器中,訪問時通過簽名信息sign獲取到URL源地址,以此保護原URL不被篡改。這種操作方式必須將所有的URL在服務器中存儲一份,會造成內容冗余,數據量大時解析效率不高的問題,同時,還原后的URL也會暴露原鏈接信息,可能會遭受攻擊。
3)使用標準的MD5算法進行簽名。MD5算法因其理論上的不可解密特性應用范圍廣泛,但也因暴力破解技術的發展變得不可靠,標準的MD5加密數據也可能遭到破解。
技術實現要素:
本發明要解決的技術問題是提供一種基于MD5算法的URL防篡改簽名及驗簽方法。
為了解決上述技術問題,本發明采用的技術方案是,基于MD5算法的URL防篡改簽名及驗簽方法,包括以下步驟:
(1)生成簽名
URL的一般語法格式為:
protocol://hostname[:port]/path/[;parameters][?query]#fragment
使用URL中的protocol(協議)、hostname(主機名)、port(端口號)、path(路徑)、query(查詢)字段信息組合形成待加密字符串S1,通過基于MD5算法的自定義加密算法得到簽名字符串Sign;
(2)生成含簽名的URL
將步驟(1)中的簽名字符串Sign附加在URL的query(查詢)字段信息中,得到含簽名的URL;
(3)驗證URL簽名
用戶訪問步驟(2)中含簽名的URL時,web服務端驗證URL簽名的合法性,即通過URL中提取待加密字符串S2,通過步驟(1)中基于MD5的自定義加密算法,得到新的簽名字符串Sign2,將新簽名Sign2與URL上提取的原簽名Sign進行比對,如果簽名一致,則認定URL未被篡改;如果比對結果顯示不一致,則認定URL已經被篡改。
作為優選,步驟(1)中待加密字符串包括以下內容:
S2=S1+Ls;
其中S1為URL關鍵字段內容(S1=“protocol://hostname[:port]/path/”);Ls是URL上query參數按字典序排列后的結果。
作為進一步優選,按字典序排列是英文字母排序靠前的字母將會排在前面,可保證排序的結果是一致的,即字母A排列在字母B之前,字符串ABC排列在字符串ACD之前。
作為優選,步驟(1)中自定義加密算法包括以下步驟:
(5)獲得消息摘要
對待加密字符串S,使用MD5算法獲得16位的消息摘要digest;
(6)移位運算獲得加密結果
對16位消息摘要digest進行遍歷處理,由每一位摘要內容b生成3位加密字符M[3],最終得到48位的加密字符串結果。
作為進一步優選,移位運算的具體步驟如下:
(1)消息摘要b右移4位,得到密碼M[0];
(2)消息摘要b右移2位,得到密碼M[1];
(3)消息摘要b右移0位,得到密碼M[2]。
本發明的有益效果是:
通過URL加密簽名及驗簽的方式鑒別URL是否經過篡改,使用基于MD5算法的自定義加密算法,提升了加密算法的安全性,具備完善的簽名及驗簽機制,能夠有效阻止HTTP非法請求攻擊,保護數據在合法條件下顯示。
附圖說明
下面結合附圖和具體實施方式對本發明作進一步詳細的說明。
圖1是本發明實施例的URL防篡改簽名方法的流程圖。
圖2是本發明實施例的URL防篡改驗簽方法流程圖。
圖3是本發明實施例的基于MD5算法的自定義加密算法流程圖。
具體實施方式
一種基于MD5算法的URL防篡改簽名及驗簽方法,包括以下步驟:
一、生成簽名
簽名的生成過程具體步驟如下:
1)從URL中提取出protocol(協議)、hostname(主機名)、port(端口號)、path(路徑)部分,拼接形成字符串S1(S1=“protocol://hostname[:port]/path/”)。
2)從URL中提取出query(查詢)參數字段內容,形成{[key1:value1],[key2:value2]…}形式的鍵值對類列表Lk,將Lk按照key內容的字典順序進行排序(如{[“bbb”:1],[“aaa”:2]}排序后得到{[“aaa”:2],[“bbb”:1]}),得到排序好的列表Ls。
3)將Ls鍵值對列表中的鍵值對按先后順序拼接到S1中,得到待簽名串S2,S2=S1+”key1value1key2va lue2”。
4)使用基于MD5算法的自定義加密算法對S2進行加密,得到加密后的簽名字符串Sign,即Sign=MD5Impr(S2)?;贛D5算法的自定義加密算法過程如圖3所示。
二、生成含簽名的URL
將簽名字符串Sign附加到URL地址上,形成含簽名的URLs。URLs=URL+”?[&]sign=”+Sign。URLs生成的過程如圖1所示。
三、驗證URL簽名
使用URLs訪間網站內容時,通過驗證URLs中的簽名信息來鑒定原URL是否已被篡改。具體過程如下:
1)從URLs中提取出protocol(協議)、hostname(主機名)、port(端口號)、path(路徑)部分,拼接形成字符串SN1(SN1=“protocol://hostname[:port]/path/”)。
2)從URLs中提取出query(查詢)參數字段內容,去掉“sign”字段,形成{[key1:value1],[key2:value2]…}形式的鍵值對類列表LNk,將LNk按照key內容的字典順序進行排序,得到排序好的列表LNs。
3)將LNs鍵值對列表中的鍵值對按先后順序拼接到SN1中,得到待簽名串SN2,SN2=SN1+”key1value1key2va1ue2”。
4)使用基于MD5的自定義加密算法對SN2進行加密,得到加密后的簽名字符串Sign2,即Sign2=MD5Impr(SN2)。
5)比較Sign2與Sign是否相同,如果相同則表示URLs在傳播過程中未曾被篡改,是合法鏈接地址,可以返回相關數據和內容;如果Sign2與Sign不相同,則表示URLs中的某個內容在傳播過程中已被篡改,本請求非法,可以給出異常提示。驗證URL簽名驗證方法過程如圖2所示。
以下是一個實例:
假定要對URL:
“http://www.test.com?username=aaa&password=123456”
進行簽名與驗簽,過程如下:
1、生成簽名
1)S1=http://www.test.com;
2)Lk={[username:aaa],[password:123456]};
Ls={[password:123456],[username:aaa]}
3)S2=S1+Ls=http://www.test.compassword123456usernameaaa;
4)Sign=MD5Impr(S2)=
43c57fbc0417ebd002c3f3ebe95c00be8bc0c3e6ab541542;
2、生成含簽名的URL
URLs=URL+”?[&]sign=”+Sign=
http://www.test.com?username=aaa&password=123456&sign=
43c57fbc0417ebd002c3f3ebe95c000be8bc0c3e6ab541542
3、驗證URL簽名
設定URLs=
http://www.test.com?username=aaa&password=123456&sign=
43c57fbc0417ebd002c3f3ebe95c00be8bc0c3e6ab541542,對該URLs進行驗簽如下:
1)SN1=http://www.test.com;
2)LNk={[username:aaa],[password:123456]};
LNs={[password:123456],[username:aaa]}
3)SN2=SN1+LNs=http://www.test.compassword123456usernameaaa;
4)Sign2=MD5Impr(SN2)=
43c57fbc0417ebd002c3f3ebe95c00be8bc0c3e6ab541542;
5)Sign==Sign2?true:false;
驗簽結果顯示URLs未經過篡改。當URLs=http://www.test.com?username=aaa&password=1234567&sign=43c57fbc0417ebd002c3f3ebe95c00be8bc0c3e6ab541542(僅多一個數字7)時,Sign2=3d69413d6c15417814955a95bebd6801583ffd617f4177d5,此時Sing2?。絊ign,表示URLs已被篡改。
以上所述的本發明實施方式,并不構成對本發明保護范圍的限定。任何在本發明的精神和原則之內所作的修改、等同替換和改進等,均應包含在本發明的權利要求保護范圍之內。