本申請涉及數(shù)據(jù)安全保護(hù)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)存儲方法以及數(shù)據(jù)提取方法。
背景技術(shù):
目前,在客戶端的程序開發(fā)中,會使用到一些關(guān)鍵的數(shù)據(jù),而對這些數(shù)據(jù)的保護(hù)則是該算法是否安全的關(guān)鍵點。
例如,對于一個應(yīng)用程序來說,其用戶的登錄密碼則是非常重要的,或者其數(shù)據(jù)解密時使用的key(密碼、密鑰)值也是非常重要,其key值的安全則決定了該數(shù)據(jù)的安全性。
目前,通常的做法是使用分配的一塊連續(xù)的內(nèi)存空間來存儲其key值,然后對該連續(xù)的內(nèi)存空間的數(shù)據(jù)進(jìn)行加密,那么對于有逆向調(diào)試技術(shù)的hack(黑客)來說,則可以通過設(shè)置調(diào)試斷點來在加密前獲取到該key值存儲在內(nèi)存空間的地址,則讀取該地址的內(nèi)容就是該key值的內(nèi)容,在加密前獲取到該值,所以繞過了加密,所以從逆向分析的角度來說,其數(shù)據(jù)使用連續(xù)的內(nèi)存空間存儲是不安全的。
例如圖1,是一個順序存儲結(jié)構(gòu)圖,其中數(shù)據(jù)a1,a2,a3則在內(nèi)存中挨著存儲,那么獲取到數(shù)據(jù)a1的地址,則可以很輕易的獲取到a2,a3的地址。并且一旦hack通過設(shè)置內(nèi)存斷點,查看內(nèi)存則一下可以看到內(nèi)存中存儲的數(shù)據(jù)內(nèi)容。
因此,需要一種更為復(fù)雜的數(shù)據(jù)存儲方法,該數(shù)據(jù)的存儲和讀取都會比較復(fù)雜,那么即使hack獲取到了該數(shù)據(jù)的內(nèi)存地址,不知道其數(shù)據(jù)的存儲結(jié)構(gòu),也是無法獲取到整個數(shù)據(jù)的。
技術(shù)實現(xiàn)要素:
本發(fā)明了提供了一種數(shù)據(jù)存儲方法以及數(shù)據(jù)提取方法,以解決能夠獲取到整個存儲數(shù)據(jù)的技術(shù)問題。
為解決上述技術(shù)問題,本發(fā)明提供了一種數(shù)據(jù)存儲方法,所述方法包括:
確定出需要存儲的存儲數(shù)據(jù);
利用stl容器套嵌stl容器的方式形成一樹狀結(jié)構(gòu);
在所述樹狀結(jié)構(gòu)中,確定出上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值;
基于所述上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,確定出下一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,進(jìn)而確定出所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值;
根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中。
優(yōu)選的,對所述存儲數(shù)據(jù)進(jìn)行加密。
優(yōu)選的,所述對所述存儲數(shù)據(jù)進(jìn)行加密,包括:
利用tea加密算法對所述存儲數(shù)據(jù)進(jìn)行加密。
優(yōu)選的,當(dāng)所述上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點為首個上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點時,所述確定出上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,包括:
確定一初始鍵值;
將所述初始鍵值進(jìn)行哈希得到首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值。
優(yōu)選的,所述根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中,包括:
確定出所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的第一存儲子數(shù)據(jù);其中,所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的第一存儲子數(shù)據(jù)合并為所述存儲數(shù)據(jù);
將所述所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值和各自的第一存儲子數(shù)據(jù),作為各自的第二存儲子數(shù)據(jù);
將所述所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值和各自的第二存儲子數(shù)據(jù)一并存儲在對應(yīng)的葉子節(jié)點中。
優(yōu)選的,所述根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于所述存儲數(shù)據(jù)的葉子節(jié)點中之后,還包括:
將所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的地址對應(yīng)存儲到對應(yīng)的上一層父節(jié)點中。
優(yōu)選的,所述將所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的地址對應(yīng)存儲到對應(yīng)的上一層父節(jié)點中之后,包括:
再將對應(yīng)的上一層父節(jié)點地址存儲到各自對應(yīng)的上一層父節(jié)點中。
本發(fā)明公開了一種數(shù)據(jù)提取的方法,所述方法包括:
確定出樹狀結(jié)構(gòu)中的所有用于存儲提取數(shù)據(jù)的葉子節(jié)點;其中,所述樹狀結(jié)構(gòu)利用stl容器套嵌stl容器的方式形成;
確定出所有用于存儲提取數(shù)據(jù)的葉子節(jié)點的鍵值,然后對應(yīng)提取出所述提取數(shù)據(jù);其中,在所有用于存儲所述提取數(shù)據(jù)的葉子節(jié)點中,后一個用于存儲提取數(shù)據(jù)的葉子節(jié)點的鍵值是通過前一個用于存儲所述提取數(shù)據(jù)的葉子節(jié)點的鍵值進(jìn)行確認(rèn)。
優(yōu)選的,所述確定出所有用于存儲提取數(shù)據(jù)的葉子節(jié)點的鍵值,然后對應(yīng)提取出所述提取數(shù)據(jù),包括:
在所述所有用于存儲提取數(shù)據(jù)的葉子節(jié)點中,確定出待提取葉子節(jié)點;
基于所述待提取葉子節(jié)點的前一個用于存儲所述提取數(shù)據(jù)的待葉子節(jié)點的鍵值確定出所述待提取葉子節(jié)點的鍵值;
基于所述待提取葉子節(jié)點的鍵值,提取出對應(yīng)的第二存儲子數(shù)據(jù);
在所述第二存儲子數(shù)據(jù)中,基于所述待提取葉子節(jié)點的鍵值提取出的對應(yīng)的第一存儲子數(shù)據(jù),其中,所有用于存儲提取數(shù)據(jù)的葉子節(jié)點中存儲的第一存儲子數(shù)據(jù)合并為所述提取數(shù)據(jù)。
優(yōu)選的,所述基于所述待提取葉子節(jié)點的鍵值提取出的對應(yīng)的第一存儲子數(shù)據(jù)之后,還包括:
對所述待提取葉子節(jié)點的對應(yīng)的第一存儲子數(shù)據(jù)進(jìn)行解密。
通過本發(fā)明的一個或者多個技術(shù)方案,本發(fā)明具有以下有益效果或者優(yōu)點:
本發(fā)明公開了一種數(shù)據(jù)存儲方法以及數(shù)據(jù)提取方法,該數(shù)據(jù)存儲方法包括:先確定出存儲數(shù)據(jù),并利用stl容器套嵌stl容器的方式形成一樹狀結(jié)構(gòu),然后在葉子節(jié)點中存儲所述存儲數(shù)據(jù)。而在存儲時,利用上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,確定出下一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,進(jìn)而確定出所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值;然后根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中。由于本發(fā)明的存儲數(shù)據(jù)并不是連續(xù)存儲,而是存儲在不同的葉子節(jié)點中,從而使得其數(shù)據(jù)存儲結(jié)構(gòu)更為復(fù)雜。那么即使被黑客攻擊,也不會向現(xiàn)有技術(shù)中所呈現(xiàn)的會獲取到所有的存儲數(shù)據(jù),極大的保護(hù)了數(shù)據(jù)的安全性。
進(jìn)一步的,葉子節(jié)點則存儲實際的數(shù)據(jù),分支節(jié)點則存儲下一個分支的地址。從而即使hack獲取到內(nèi)存地址,不知道數(shù)據(jù)的存儲結(jié)構(gòu)他也無法獲取整個數(shù)據(jù)。所以可以極大的保護(hù)數(shù)據(jù)的安全性。
進(jìn)一步的,本發(fā)明的存儲數(shù)據(jù)事先還會進(jìn)行加密,增加數(shù)據(jù)的安全性。
進(jìn)一步的,本發(fā)明的葉子節(jié)點采用嵌套式結(jié)構(gòu)存儲數(shù)據(jù),即先將葉子節(jié)點的鍵值和實際的存儲數(shù)據(jù)作為第一存儲子數(shù)據(jù),然后再將鍵值和第一存儲子數(shù)據(jù)作為第二存儲子數(shù)據(jù)一并存入葉子節(jié)點中,故而即便獲取到葉子節(jié)點,不知道葉子節(jié)點的這種存儲結(jié)構(gòu)也無法獲取整個數(shù)據(jù)。所以可以極大的保護(hù)數(shù)據(jù)的安全性。
附圖說明
圖1為一個順序存儲結(jié)構(gòu)圖;
圖2為本發(fā)明實施例中數(shù)據(jù)存儲方法的流程圖;
圖3為本發(fā)明實施例中樹狀結(jié)構(gòu)圖;
圖4為本發(fā)明實施例中數(shù)據(jù)提取方法的流程圖。
具體實施方式
本發(fā)明實施例公開了一種數(shù)據(jù)存儲方法,是基于stl容器(也叫stlset容器,是一個計算機(jī)科學(xué)領(lǐng)域中的重要概念,描述一個控制變長元素序列的對象)來對數(shù)據(jù)進(jìn)行加密存儲保護(hù)的方法。該方法的實施原理是:本發(fā)明則使用套嵌的stl容器來存儲整個數(shù)據(jù)。其中,stl容器中的map容器則是使用樹狀結(jié)構(gòu)來存儲數(shù)據(jù),樹中只有葉子節(jié)點才存儲數(shù)據(jù),而分支節(jié)點則存儲葉子節(jié)點的地址。
鑒于此,本發(fā)明則使用map容器套嵌map容器來存儲數(shù)據(jù),使得其存儲和讀取都不是連續(xù)存儲,從而使得其數(shù)據(jù)存儲結(jié)構(gòu)更為復(fù)雜。
另外,本發(fā)明還會編寫一個數(shù)據(jù)存儲的接口和數(shù)據(jù)讀取的接口,使得使用者非常方便,對于使用者則是透明的。從而在程序任意一處下斷點都無法獲取到該key值的明文。從而提高逆向分析者的門檻,極大的保護(hù)數(shù)據(jù)存儲的安全性。
本發(fā)明使用基于stl容器套嵌來實現(xiàn)復(fù)雜數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)。其中,可以使用的stl容器包括map容器、list容器、multimap容器。容器(container)的概念的出現(xiàn)早于模板(template),它原本是一個計算機(jī)科學(xué)領(lǐng)域中的一個重要概念,但在這里,它的概念和stl混合在一起了。下面是在stl中出現(xiàn)的7種容器:
vector(向量)--stl中標(biāo)準(zhǔn)而安全的數(shù)組。只能在vector的"前面"增加數(shù)據(jù)。
deque(雙端隊列double-endedqueue)--在功能上和vector相似,但是可以在前后兩端向其中添加數(shù)據(jù)。
list(列表)--游標(biāo)一次只可以移動一步。如果你對鏈表已經(jīng)很熟悉,那么stl中的list則是一個雙向鏈表(每個節(jié)點有指向前驅(qū)和指向后繼的兩個指針)。
set(集合)--包含了經(jīng)過排序了的數(shù)據(jù),這些數(shù)據(jù)的值(value)必須是唯一的。
map(映射)--經(jīng)過排序了的二元組的集合,map中的每個元素都是由兩個值組成,其中的key(鍵值,一個map中的鍵值必須是唯一的)是在排序或搜索時使用,它的值可以在容器中重新獲??;而另一個值是該元素關(guān)聯(lián)的數(shù)值。比如,除了可以ar[43]="overripe"這樣找到一個數(shù)據(jù),map還可以通過ar["banana"]="overripe"這樣的方法找到一個數(shù)據(jù)。如果你想獲得其中的元素信息,通過輸入元素的全名就可以輕松實現(xiàn)。
multiset(多重集)--和集合(set)相似,然而其中的值不要求必須是唯一的(即可以有重復(fù))。
multimap(多重映射)--和映射(map)相似,然而其中的鍵值不要求必須是唯一的(即可以有重復(fù))。
本發(fā)明則使用組合的形式來使用,如map容器中再存儲map,同時對存儲是原始數(shù)據(jù)進(jìn)行加密,從而進(jìn)一步的保護(hù)了數(shù)據(jù)的安全性。當(dāng)然,其他的容器也可以,本發(fā)明僅使用map容器為例。
通常的數(shù)據(jù)存儲結(jié)構(gòu)是分配一處連續(xù)的存儲空間來存儲數(shù)據(jù),如使用內(nèi)存分配函數(shù)char*pdata=(char*)malloc(datalength),那么其分配的內(nèi)存空間pdata則是一片連續(xù)的存儲空間,其存儲的數(shù)據(jù)會是連續(xù)的,使得一旦獲取到pdata的內(nèi)存地址那么則可以獲取到整個pdata的內(nèi)容。假設(shè)pdata存儲了一個字符串“datakey”。那么對應(yīng)到內(nèi)存中則也是:“datakey”,數(shù)據(jù)挨個存儲。
而本申請到從逆向的角度進(jìn)行實施,在hack(黑客)即使獲取到數(shù)據(jù)存儲的地址后,也無法或者整個數(shù)據(jù),因為數(shù)據(jù)的存儲不是使用的連續(xù)存儲空間,而是使用一種樹狀結(jié)構(gòu),樹中有多個分支,和葉子節(jié)點,葉子節(jié)點則存儲實際的數(shù)據(jù),分支節(jié)點則存儲下一個分支的地址。從而即使hack獲取到內(nèi)存地址,不知道數(shù)據(jù)的存儲結(jié)構(gòu)他也無法獲取整個數(shù)據(jù)。所以可以極大的保護(hù)數(shù)據(jù)的安全性。
為了使本申請所屬技術(shù)領(lǐng)域中的技術(shù)人員更清楚地理解本申請,下面結(jié)合附圖,通過具體實施例對本申請技術(shù)方案作詳細(xì)描述。
參看圖2,本發(fā)明的數(shù)據(jù)存儲方法,包括:
步驟11,確定出需要存儲的存儲數(shù)據(jù)。
本發(fā)明的存儲數(shù)據(jù)不限制類型和數(shù)據(jù)量,例如可以是視頻數(shù)據(jù)、音頻數(shù)據(jù),也可以為字符串等等,在此本發(fā)明不做限制。
在確定出需要存儲的存儲數(shù)據(jù)之后,可對所述存儲數(shù)據(jù)進(jìn)行加密。對存儲數(shù)據(jù)的加密使用何種算法,本發(fā)明不做限制,故而本發(fā)明可以使用任意加密算法對存儲數(shù)據(jù)進(jìn)行加密,例如。利用tea加密算法對所述存儲數(shù)據(jù)進(jìn)行加密。
步驟12,利用stl容器套嵌stl容器的方式形成一樹狀結(jié)構(gòu)。
在具體的實施過程中,本發(fā)明使用map容器套嵌map容器來存儲數(shù)據(jù),而在stl容器中,map容器本身是以樹狀結(jié)構(gòu)來存儲數(shù)據(jù),本發(fā)明為了使得數(shù)據(jù)更為復(fù)雜則使用了map容器套嵌map容器,即map容器再存儲map容器,來形成樹狀結(jié)構(gòu)。
在樹狀結(jié)構(gòu)中,葉子節(jié)點用來存儲數(shù)據(jù),而分支機(jī)構(gòu)中的節(jié)點只是用來存儲地址。而在每一個葉子節(jié)點中,都使用了map容器來存儲數(shù)據(jù)。下面介紹map容器的定義:
map<int,map<int,int>>mapmapdata;
其中,對于map容器,第一個參數(shù)是其的健值,第二個則是其健值對應(yīng)的數(shù)據(jù),通過健值則可以找到對應(yīng)的數(shù)據(jù)。本發(fā)明的第一個map其存儲的是另一個map對象,而第二個map中的健值對應(yīng)的則是本發(fā)明的實際的存儲數(shù)據(jù)。
例如,map<key1,map<key2,data>>,其中key1和key2則都是健值,實際data則是最終要存儲的數(shù)據(jù)。而這種存儲方法每次只存儲數(shù)據(jù)串中的一個數(shù)據(jù),對于整個數(shù)據(jù)串則一個一個的存儲,而讀取時也是使用一個一個的讀取,從而沒有地方可以獲取到整個數(shù)據(jù)串的內(nèi)容。
參看圖3,為一樹狀結(jié)構(gòu)圖。其中,葉子節(jié)點a、e、r、x則存儲的是具體的存儲數(shù)據(jù)。而對于分支節(jié)點和根節(jié)點h、c、s則是存儲的葉子節(jié)點的地址。所以黑客獲取到根節(jié)點h的地址,但是不知道其數(shù)據(jù)怎么存儲的話是無法讀取到葉子節(jié)點a、e、r、x的數(shù)據(jù)的。
當(dāng)然,此處的三層數(shù)狀結(jié)構(gòu)僅作舉例,實際應(yīng)用中,本發(fā)明還可以有多層例如4層、5層等等的樹狀結(jié)構(gòu)。
步驟13,在所述樹狀結(jié)構(gòu)中,確定出上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值。
在具體的實施過程中,若上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點為首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點,那么,首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值是通過下面的步驟確定的:確定一初始鍵值;將所述初始鍵值進(jìn)行哈希得到首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值。例如,將crc32hash做為其hash(哈希)算法。若初始鍵值是“a”,那么其計算hash后則得到0xd3d99e8b,那么0xd3d99e8b則做為首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值。當(dāng)然,哈希算法還可以有其他。
步驟14,基于所述上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,確定出下一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,進(jìn)而確定出所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值。
具體的實施過程中,是將上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值進(jìn)行哈希得到下一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,以此類推,則可以得到所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值。
步驟15,根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中。
在具體的實施過程中,本發(fā)明在每個葉子節(jié)點中存儲數(shù)據(jù)時都是按照map容器的定義進(jìn)行數(shù)據(jù)存儲。當(dāng)然,還可能存在這種情況,就是數(shù)據(jù)存儲時不會用到所有的葉子節(jié)點,本發(fā)明就針對那些用于存儲數(shù)據(jù)的葉子節(jié)點。
為了提高存取數(shù)據(jù)的效率,基于map技術(shù)的底層實現(xiàn),會根據(jù)數(shù)據(jù)量和數(shù)據(jù)動態(tài)調(diào)整葉子節(jié)點的順序和層級(即深度,深度表示的是葉子節(jié)點的層數(shù)。葉子節(jié)點的層數(shù)越多,表示葉子節(jié)點的深度越大),當(dāng)然,層級也會影響存取數(shù)據(jù)的效率,層級越少,提取數(shù)據(jù)的效率越高。
而在葉子節(jié)點存儲數(shù)據(jù)的過程中,首先確定出所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的第一存儲子數(shù)據(jù)。其中,所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的第一存儲子數(shù)據(jù)合并為所述存儲數(shù)據(jù);
其次,將所述所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值和各自的第一存儲子數(shù)據(jù),作為各自的第二存儲子數(shù)據(jù)。
最后,將所述所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值和各自的第二存儲子數(shù)據(jù)一并存儲在對應(yīng)的葉子節(jié)點中。
下面以首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點存儲數(shù)據(jù)的過程為例,其他葉子節(jié)點的存儲數(shù)據(jù)的過程相似。
本發(fā)明從存儲數(shù)據(jù)中取出一部分作為第一存儲子數(shù)據(jù)。然后,將首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值和第一存儲子數(shù)據(jù)一并作為第二存儲子數(shù)據(jù)。然后再將首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值和第二存儲子數(shù)據(jù)一并出入首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中。
此后,可對首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值進(jìn)行哈希,得到第二個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值。然后再從存儲數(shù)據(jù)中取出部分?jǐn)?shù)據(jù),存儲到第二個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中。當(dāng)然,對于第二個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的存儲過程也和首個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的存儲過程相同,只是鍵值和存儲的數(shù)據(jù)有差別而已。
當(dāng)然,也可以先將存儲數(shù)據(jù)進(jìn)行劃分,然后在得到各個葉子節(jié)點的鍵值之后,在進(jìn)行存儲。存儲也可以是隨機(jī)存儲、按數(shù)據(jù)量大小、按類型等等方式進(jìn)行分配存儲。但是存儲在葉子節(jié)點的具體過程是和上述類似的,故而本發(fā)明在此不再贅述。
作為一種可選的實施例,在根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于所述存儲數(shù)據(jù)的葉子節(jié)之后,還包括:將所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的地址對應(yīng)存儲到對應(yīng)的上一層父節(jié)點中。
作為一種可選的實施例,在將所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的地址對應(yīng)存儲到對應(yīng)的上一層父節(jié)點中之后,再將對應(yīng)的上一層父節(jié)點地址存儲到各自對應(yīng)的上一層父節(jié)點中。
在下面的實施例,本發(fā)明舉例進(jìn)行說明。
本發(fā)明使用了map套嵌map的方式來存儲每一個數(shù)據(jù),并且對存儲的數(shù)據(jù)進(jìn)行加密后存儲,本發(fā)明則編寫一個數(shù)據(jù)存儲接口提供對使用者比較方便接口來存儲重要數(shù)據(jù)。
本發(fā)明對于map中存儲的健值的生成則使用一個初始的健值,然后每次存儲一次數(shù)據(jù)則對健值計算一次hash,做為下一個節(jié)點在數(shù)據(jù)存儲時的健值。因為hash算法對一個初始值計算hash會得到固定的值做為下一個hash數(shù)據(jù)的輸入得到下一個健值。
本發(fā)明使用crc32hash做為其hash算法。例如:初始值是“a”那么其計算hash后則得到0xd3d99e8b,那么0xd3d99e8b則做為第一個數(shù)據(jù)的健值,對于下個數(shù)據(jù)存儲時其健值則使用0xd3d99e8b計算hash后的值做為健值。使用此方法可以使得健值本身也是比較復(fù)雜的,比直接使用1,2,3更為復(fù)雜,因為其看不到任何規(guī)律。
具體接口voidcachedata(intdata)實現(xiàn)如下:
本接口則提供一個數(shù)據(jù)的存儲,對于存儲多個數(shù)據(jù),則可以對每個數(shù)據(jù)分別調(diào)用該接口來存儲。
基于同一種發(fā)明構(gòu)思,本發(fā)明還公開了一種數(shù)據(jù)提取的方法,和上述數(shù)據(jù)存儲方法相對應(yīng)。
在此方法中,提取數(shù)據(jù)和上述公開的存儲數(shù)據(jù)本質(zhì)上是相同的,只是為了敘述便利,故而在此改為提取數(shù)據(jù)。而本發(fā)明的第一提取子數(shù)據(jù)對應(yīng)上文中的第一存儲子數(shù)據(jù),第二提取子數(shù)據(jù)對應(yīng)本發(fā)明的第二提取子數(shù)據(jù)。而用于存儲提取數(shù)據(jù)的葉子節(jié)點對應(yīng)上文中的用于存儲存儲數(shù)據(jù)的葉子節(jié)點。
參看圖4,在具體的實施過程中,該方法包括:
步驟41,確定出樹狀結(jié)構(gòu)中的所有用于存儲提取數(shù)據(jù)的葉子節(jié)點;其中,所述樹狀結(jié)構(gòu)利用stl容器套嵌stl容器的方式形成。
步驟42,確定出所有用于存儲提取數(shù)據(jù)的葉子節(jié)點的鍵值,然后對應(yīng)提取出所述提取數(shù)據(jù)。
其中,在所有用于存儲所述提取數(shù)據(jù)的葉子節(jié)點中,后一個用于存儲提取數(shù)據(jù)的葉子節(jié)點的鍵值是通過前一個用于存儲所述提取數(shù)據(jù)的葉子節(jié)點的鍵值進(jìn)行確認(rèn)。
當(dāng)然,在首個存儲所述提取數(shù)據(jù)的葉子節(jié)點的鍵值是通過對初始鍵值哈希獲得的。
在具體的實施過程中,所述確定出所有用于存儲提取數(shù)據(jù)的葉子節(jié)點的鍵值,然后對應(yīng)提取出所述提取數(shù)據(jù),包括:
在所述所有用于存儲提取數(shù)據(jù)的葉子節(jié)點中,確定出待提取葉子節(jié)點;
基于所述待提取葉子節(jié)點的前一個用于存儲所述提取數(shù)據(jù)的待葉子節(jié)點的鍵值確定出所述待提取葉子節(jié)點的鍵值;
基于所述待提取葉子節(jié)點的鍵值,提取出對應(yīng)的第二存儲子數(shù)據(jù);
在所述第二存儲子數(shù)據(jù)中,基于所述待提取葉子節(jié)點的鍵值提取出的對應(yīng)的第一存儲子數(shù)據(jù),其中,所有用于存儲提取數(shù)據(jù)的葉子節(jié)點中存儲的第一存儲子數(shù)據(jù)合并為所述提取數(shù)據(jù)。
而在所述基于所述待提取葉子節(jié)點的鍵值提取出的對應(yīng)的第一存儲子數(shù)據(jù)之后,還包括:對所述待提取葉子節(jié)點的對應(yīng)的第一存儲子數(shù)據(jù)進(jìn)行解密。
下面舉例進(jìn)行說明。
當(dāng)將數(shù)據(jù)存儲在樹狀結(jié)構(gòu)中之后,而在使用到該數(shù)據(jù)的地方則需要讀取該數(shù)據(jù),所以需要編寫一個接口用于讀取存儲的數(shù)據(jù)。在存儲時是使用了一個初始化的key值做為數(shù)據(jù)存儲的健值,而對后續(xù)數(shù)據(jù)的健值的生成則使用對前一個健值計算hash值,而讀取時也按照此種方法則可以讀取到每個數(shù)據(jù)。具體接口intgetdata(intno)實現(xiàn)如下:
其中返回值則是獲取到的最終的值,其中參數(shù)no則是標(biāo)示其在整個存儲數(shù)據(jù)中的序號,第一個數(shù)據(jù)其序號是0,第二個數(shù)據(jù)其序號是1依次類推。
首先使用一個for循環(huán)語句來計算該序號的時候其m_key值。mapmapdata_const_itritr=m_mapdata.find(m_key);
然后從第一個map中找到其存儲的子map對象,查找則調(diào)用map自身提供的find函數(shù),并使用健值m_key來查找。找到后則返回值則是該子map對象。
map<int,int>::const_iteratorit2=(*itr).second.find(m_key);
然后在子對象map中再一次使用find函數(shù)來查找,查找的健值還是使用同樣的m_key,其中查找到的結(jié)果it2.second中的健值對應(yīng)的數(shù)據(jù)則是最終的結(jié)果。
encryptdata=it2.second;
最后則需要對數(shù)據(jù)進(jìn)行解密,之前存儲時使用tea加密算法來加密,則現(xiàn)在使用對應(yīng)的解密算法來解密數(shù)據(jù)。
data=tea.decrypt(encryptdata,m_key);
則data則是得到的原始數(shù)據(jù)。如果對于獲取整個數(shù)據(jù),則可以依次的傳入序號從0開始一直獲取到整個數(shù)據(jù)。
通過本發(fā)明的一個或者多個實施例,本發(fā)明具有以下有益效果或者優(yōu)點:
本發(fā)明公開了一種數(shù)據(jù)存儲方法以及數(shù)據(jù)提取方法,該數(shù)據(jù)存儲方法包括:先確定出存儲數(shù)據(jù),并利用stl容器套嵌stl容器的方式形成一樹狀結(jié)構(gòu),然后在葉子節(jié)點中存儲所述存儲數(shù)據(jù)。而在存儲時,利用上一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,確定出下一個用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點的鍵值,進(jìn)而確定出所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值;然后根據(jù)所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點各自的鍵值,將所述存儲數(shù)據(jù)對應(yīng)存儲到所有用于存儲所述存儲數(shù)據(jù)的葉子節(jié)點中。由于本發(fā)明的存儲數(shù)據(jù)并不是連續(xù)存儲,而是存儲在不同的葉子節(jié)點中,從而使得其數(shù)據(jù)存儲結(jié)構(gòu)更為復(fù)雜。那么即使被黑客攻擊,也不會向現(xiàn)有技術(shù)中所呈現(xiàn)的會獲取到所有的存儲數(shù)據(jù),極大的保護(hù)了數(shù)據(jù)的安全性。
進(jìn)一步的,葉子節(jié)點則存儲實際的數(shù)據(jù),分支節(jié)點則存儲下一個分支的地址。從而即使hack獲取到內(nèi)存地址,不知道數(shù)據(jù)的存儲結(jié)構(gòu)他也無法獲取整個數(shù)據(jù)。所以可以極大的保護(hù)數(shù)據(jù)的安全性。
進(jìn)一步的,本發(fā)明的存儲數(shù)據(jù)事先還會進(jìn)行加密,增加數(shù)據(jù)的安全性。
進(jìn)一步的,本發(fā)明的葉子節(jié)點采用嵌套式結(jié)構(gòu)存儲數(shù)據(jù),即先將葉子節(jié)點的鍵值和實際的存儲數(shù)據(jù)作為第一存儲子數(shù)據(jù),然后再將鍵值和第一存儲子數(shù)據(jù)作為第二存儲子數(shù)據(jù)一并存入葉子節(jié)點中,故而即便獲取到葉子節(jié)點,不知道葉子節(jié)點的這種存儲結(jié)構(gòu)也無法獲取整個數(shù)據(jù)。所以可以極大的保護(hù)數(shù)據(jù)的安全性。
盡管已描述了本申請的優(yōu)選實施例,但本領(lǐng)域內(nèi)的普通技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實施例以及落入本申請范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對本申請進(jìn)行各種改動和變型而不脫離本申請的精神和范圍。這樣,倘若本申請的這些修改和變型屬于本申請權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請也意圖包含這些改動和變型在內(nèi)。