摘 要:由于當(dāng)今Web服務(wù)存在多種數(shù)據(jù)傳輸格式,不同的數(shù)據(jù)格式所需存儲(chǔ)方法的實(shí)現(xiàn)代碼存在差異,因此迫切地希望提高代碼的彈性,以適應(yīng)未來(lái)的各種數(shù)據(jù)格式。本文簡(jiǎn)單介紹了Web服務(wù),RESTful和參數(shù)傳遞,進(jìn)一步提高了代碼的彈性,并以“秘密情書(shū)”為例著重介紹了兩種加密算法,利用其對(duì)明文進(jìn)行加密,降低泄露的可能性,保證信息的安全和可靠。
關(guān)鍵詞:Web Service;RESTful;加密算法;參數(shù)傳遞
中圖分類(lèi)號(hào):TP393.09 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2019)02-0100-03
Abstract:Based on the existence of multiple data transmission formats in today’s Web services,different data formats require differences in the implementation code of storage methods. Therefore,it is urgent to improve the flexibility of the code to adapt to various data formats in the future. This article briefly introduces Web services,RESTful and parameter transfer,further improving the flexibility of the code,and introduces two encryption algorithms with a case column “secret love letter” to use it to encrypt plaintext and reduce the possibility of leakage. Ensure the safety and reliability of information.
Keywords:Web Service;RESTful;encryption algorithm;parameter transfer
0 引 言
隨著互聯(lián)網(wǎng)時(shí)代的發(fā)展,不同信息系統(tǒng)之間交互的數(shù)據(jù)格式存在差異,如果每次修改存儲(chǔ)方法的實(shí)現(xiàn)代碼,就使得代碼的彈性不夠,無(wú)法很好適應(yīng)未來(lái)的Content-type,Mine-type和Media-type等各種類(lèi)型格式,因此一種更有彈性的同樣可以實(shí)現(xiàn)該需求的代碼編寫(xiě)被提了出來(lái),這也是利用Web Service的方便之處。除此之外,在互聯(lián)網(wǎng)上傳遞信息有時(shí)候是很不安全的,一旦我們的信息被不法人員截獲,其便可以輕松了解信息的內(nèi)容,所以,在此提出了兩種加密算法在傳輸過(guò)程中對(duì)信息進(jìn)行加密,接收方對(duì)信息進(jìn)行解密后,便可以獲得信息的準(zhǔn)確內(nèi)容。
1 Web服務(wù)的概念
在談到Web服務(wù)前,我先對(duì)服務(wù)進(jìn)行簡(jiǎn)單介紹。計(jì)算機(jī)中的服務(wù)是指某個(gè)具體功能。提供計(jì)算1+1=2的功能是一種服務(wù);提供翻譯功能是一種服務(wù);根據(jù)你輸入的圓的半徑幫你畫(huà)一個(gè)圓也是一種服務(wù);更不用說(shuō)常使用到的外賣(mài)服務(wù)、地圖服務(wù)和交通服務(wù)等等。那么什么是Web服務(wù)呢?Web服務(wù)就是指使用http或https協(xié)議接受用戶的請(qǐng)求并提供功能服務(wù)的方式。平時(shí)中一個(gè)常見(jiàn)的Web服務(wù)例子,用戶在谷歌瀏覽器的地址欄中輸入http://www.baidu.com之后(按Enter鍵),瀏覽器顯示“百度搜索”這個(gè)搜索引擎。為什么我會(huì)將其理解為Web服務(wù)呢?因?yàn)槭紫冗@個(gè)服務(wù)是基于http協(xié)議的,然后,在從地址欄輸入U(xiǎn)RI到顯示“百度搜索”這整個(gè)過(guò)程是輸入U(xiǎn)RI之后(按Enter鍵),瀏覽器客戶端將http://www.baidu.com請(qǐng)求發(fā)送到服務(wù)器,請(qǐng)求服務(wù)器響應(yīng),服務(wù)器對(duì)這個(gè)請(qǐng)求進(jìn)行解析,發(fā)現(xiàn)存在一個(gè)服務(wù)可以滿足這個(gè)請(qǐng)求,之后便將其對(duì)應(yīng)的html文件發(fā)送到客戶端顯示出來(lái)。
2 RESTful的概念
REST的全稱(chēng)是Representational State Transfer,直譯為表述性狀態(tài)轉(zhuǎn)移。REST在2000年被Roy Fielding提出,是一種利用萬(wàn)維網(wǎng)的相關(guān)技術(shù)以及協(xié)議來(lái)構(gòu)建大規(guī)模網(wǎng)絡(luò)軟件的構(gòu)架方式。REST意在說(shuō)明,數(shù)據(jù)資源是可以被定義,被發(fā)布的,并且在此基礎(chǔ)上將信息的交換變得簡(jiǎn)單并具有可擴(kuò)展性。RESTful=REST+ful,既具有REST特征的設(shè)計(jì)風(fēng)格。
3 API簡(jiǎn)單參數(shù)傳遞
這里提到的簡(jiǎn)單參數(shù)是指非結(jié)構(gòu)化的參數(shù),如一個(gè)數(shù)值、一個(gè)字符串這樣的用簡(jiǎn)單變量進(jìn)行接受處理的參數(shù)。
簡(jiǎn)單參數(shù)傳遞可以選擇兩種方式傳遞:(1)附加在路徑上,表觀現(xiàn)象如真實(shí)的資源路徑無(wú)差異。(2)附加在資源路徑的之后,按照標(biāo)準(zhǔn)的值對(duì)鏈條進(jìn)行傳參。前者稱(chēng)為@PathParam注解傳參,后者稱(chēng)之為@QueryParam注解傳參。
3.1 @PathParam注解
路徑傳參,就參數(shù)傳遞的形式而言是將參數(shù)嵌入到路徑中,并從表觀形態(tài)上與資源實(shí)體所對(duì)應(yīng)的路徑具有不可區(qū)分性。@PathParam語(yǔ)法形式:@PathParam(“路徑中的參數(shù)名”)parameterType parameterName。在@PathParam中配置參數(shù)模板:@Path(“/path1/.../pathk/.../pathn”),示例:@Path(“/path/{name}/a/{age}/{gender}/myfile”)。在Class方法的參數(shù)列表中為相關(guān)參數(shù)配置@PathParam標(biāo)注,進(jìn)行參數(shù)賦值,示例:public String testPath(@Path Param(“age”) int age,@PathParam(“name”) String name,@PathParam(“gender”) String gender)。
@Path與@PathParam注解聯(lián)合工作原理:當(dāng)用戶請(qǐng)求路徑http://127.0.0.1/restful/test/path/張三/a/23/男/myfile時(shí),請(qǐng)求路徑與容器內(nèi)注冊(cè)模板進(jìn)行匹配,發(fā)現(xiàn)@PathParam(“/path/{name}/a/{age}/{gender}/myfile”)匹配成功,接著進(jìn)行路徑參數(shù)解析,將name賦值為張三,age賦值為23,gender賦值為男,方法體代碼正確執(zhí)行后通過(guò)@Produces標(biāo)注返回給用戶的結(jié)果。
3.2 @QueryParam注解
Query是指URL中由“問(wèn)號(hào)”引導(dǎo)出的值對(duì)參數(shù)鏈條。Query傳參形式:http://host:port/path?Param1=value1&...¶mn=valuen。
@QueryParam語(yǔ)法形式:@QueryParam(“路徑中的參數(shù)名”) parameterType parameterName。在Class方法的參數(shù)列表中為相關(guān)參數(shù)配置@QueryParam標(biāo)注,進(jìn)行參數(shù)賦值,示例:public String testQuery(@QueryParam (“age”) int age,@QueryParam(“name”) String name,@QueryParam(“gender”) String gender)。
@QueryParam注解工作原理:當(dāng)用戶請(qǐng)求路徑http: //127.0.0.1/restful/test/query?name=張三&age=23& gender=男,請(qǐng)求路徑與容器內(nèi)注冊(cè)模板進(jìn)行匹配,發(fā)現(xiàn)public String testQuery(@QueryParam(“age”) int age,@QueryParam(“name”) String name,@QueryParam (“gender”) String gender)匹配成功,接著進(jìn)行路徑參數(shù)解析,將name賦值為張三,age賦值為23,gender賦值為男,方法體代碼正確執(zhí)行后通過(guò)@Produces標(biāo)注返回給用戶的結(jié)果。
4 Form表單參數(shù)傳遞
Form表單是一個(gè)容器,可將容器內(nèi)的對(duì)象集合組織成參數(shù)集合,并向服務(wù)器發(fā)送這些參數(shù)。該容器內(nèi)的常見(jiàn)可用于參數(shù)傳遞的對(duì)象如:input,select,textarea等。@Form語(yǔ)法:@Form parameterType parameterName。在Class方法中用法,示例:public String testForm(@Form FormRequestValues form)。與@Form匹配的parameterType類(lèi):需要在類(lèi)的每個(gè)屬性前加一個(gè)@FormParam注解,注解中填入表單中控件的name屬性值。
5 加密算法
在這個(gè)過(guò)程中,我簡(jiǎn)單介紹一個(gè)信息交互過(guò)程“秘密的情書(shū)”,如圖1所示。
5.1 算法A
Cipher1結(jié)構(gòu):C1,R1,C2,R2,…,Cn,Rn。Cipher1實(shí)例:72,01,75,02,74,03,73,04,其中Ci和Ri為ASCII的16進(jìn)制形式,各自表示一個(gè)字節(jié)從Cipher1中獲取key的各組成字節(jié):keyBytes[i]=(Ci xor Ri);從Cipher1中獲取key的示例:keyBytes[0]=(72 xor 01);keyBytes[1]=
(75 xor 02);keyBytes[2]=(74 xor 03);keyBytes[3] =(73 xor 04);key=new String(keyBytes),下面給出實(shí)現(xiàn)代碼。
public static String getCipherKey(@Form Step1 step1) {
String secret=step1.getSecret().trim();
byte[] keyBytes=new byte[secret.length() / 4];
int k=0;
for (int i = 0; i < secret.length(); i += 4) {
String temp1 = secret.substring(i, i + 2);
byte ci = (byte) Integer.parseInt(temp1, 16);
String temp2 = secret.substring(i + 2, i + 4);
byte ri = (byte) Integer.parseInt(temp2, 16);
keyBytes[k++] = (byte) (ci ^ ri);
}
String key = new String(keyBytes);
return key;
}
5.2 算法B
明文結(jié)構(gòu):T1,T2,T3,T4,…,Tn-1,Tn,密鑰結(jié)構(gòu):K1,K2,K3,K4,K5,K6,K7,將key視為明文,將自己的學(xué)號(hào)視為密鑰,調(diào)用算法B,混合生成newKey:newKey[i]=(Ti xor Ki);注意:當(dāng)Km從為密鑰最后一個(gè)字節(jié)時(shí),Km+1=K0,Km+2=K1,即密鑰將重新從自己的首字節(jié)開(kāi)始與明文按字節(jié)進(jìn)行xor運(yùn)算,直至計(jì)算完明文的最后一個(gè)字節(jié)為止。張華在得到newKey后,再次使用算法B加密自己的短消息,此時(shí)需要加密的短消息為明文,newKey為密鑰,算法不變。注意在這個(gè)算法中,還將引入隨機(jī)數(shù)。利用Java中的getBytes[]方法獲取學(xué)號(hào)和明文的byte數(shù)組,接著生成隨機(jī)數(shù),將學(xué)號(hào)和明文的數(shù)組元素和隨機(jī)數(shù)進(jìn)行異或,將異或的結(jié)果和隨機(jī)數(shù)作為最后newKey的結(jié)果。
public static String createCipherKey(@Form Step2 step2) {
String mingwen = step2.getMingwen().trim();
String number = step2.getNumber().trim();
byte[] mw = mingwen.getBytes();
byte[] xuehao = number.getBytes();
String str = "";
for (int i = 0; i < mw.length; i++) {
byte temp1 = mw[i];
byte temp2 = xuehao[i % xuehao.length];
int ran = (int) (Math.random() * 256);
int temp = temp1 ^ temp2 ^ ran;
String ranHexString = Integer.toHexString(ran);
if (ranHexString.length() < 2)
ranHexString = "0" + ranHexString;
String tempHexString = Integer.toHexString (temp);
if (tempHexString.length() < 2)
tempHexString = "0" + tempHexString;
str = str + ranHexString + tempHexString;
}
return str;
}
6 結(jié) 論
計(jì)算機(jī)網(wǎng)絡(luò)和Web技術(shù)的高速發(fā)展,為人們提供了便利,但隨之而來(lái)的是信息的安全問(wèn)題,為此有必要以一種高效的算法對(duì)信息進(jìn)行加密,防止不法分子對(duì)信息進(jìn)行解密或讓其付出慘重代價(jià),以此保證信息的安全性。在此,僅僅提出一個(gè)簡(jiǎn)單的加密模型,在后期隨著知識(shí)的積累將對(duì)其進(jìn)一步改進(jìn)。
參考文獻(xiàn):
[1] 韓陸.Java RESTful Web Service實(shí)戰(zhàn)(第二版) [D].北京:機(jī)械工業(yè)出版社,2018.
[2] 潘運(yùn)平,王勝男,王曉川.基于WebService的整車(chē)物流管理信息系統(tǒng)研究 [J].武漢理工大學(xué)學(xué)報(bào)(信息與管理工程版),2013,35(5):710-713.
作者簡(jiǎn)介:徐彤(1998.12-),男,江西鷹潭人,本科,主要研究方向:軟件工程理論與方法。