摘 要:由于当今Web服务存在多种数据传输格式,不同的数据格式所需存储方法的实现代码存在差异,因此迫切地希望提高代码的弹性,以适应未来的各种数据格式。本文简单介绍了Web服务,RESTful和参数传递,进一步提高了代码的弹性,并以“秘密情书”为例着重介绍了两种加密算法,利用其对明文进行加密,降低泄露的可能性,保证信息的安全和可靠。
关键词:Web Service;RESTful;加密算法;参数传递
中图分类号:TP393.09 文献标识码:A 文章编号: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 引 言
随着互联网时代的发展,不同信息系统之间交互的数据格式存在差异,如果每次修改存储方法的实现代码,就使得代码的弹性不够,无法很好适应未来的Content-type,Mine-type和Media-type等各种类型格式,因此一种更有弹性的同样可以实现该需求的代码编写被提了出来,这也是利用Web Service的方便之处。除此之外,在互联网上传递信息有时候是很不安全的,一旦我们的信息被不法人员截获,其便可以轻松了解信息的内容,所以,在此提出了两种加密算法在传输过程中对信息进行加密,接收方对信息进行解密后,便可以获得信息的准确内容。
1 Web服务的概念
在谈到Web服务前,我先对服务进行简单介绍。计算机中的服务是指某个具体功能。提供计算1+1=2的功能是一种服务;提供翻译功能是一种服务;根据你输入的圆的半径幫你画一个圆也是一种服务;更不用说常使用到的外卖服务、地图服务和交通服务等等。那么什么是Web服务呢?Web服务就是指使用http或https协议接受用户的请求并提供功能服务的方式。平时中一个常见的Web服务例子,用户在谷歌浏览器的地址栏中输入http://www.baidu.com之后(按Enter键),浏览器显示“百度搜索”这个搜索引擎。为什么我会将其理解为Web服务呢?因为首先这个服务是基于http协议的,然后,在从地址栏输入URI到显示“百度搜索”这整个过程是输入URI之后(按Enter键),浏览器客户端将http://www.baidu.com请求发送到服务器,请求服务器响应,服务器对这个请求进行解析,发现存在一个服务可以满足这个请求,之后便将其对应的html文件发送到客户端显示出来。
2 RESTful的概念
REST的全称是Representational State Transfer,直译为表述性状态转移。REST在2000年被Roy Fielding提出,是一种利用万维网的相关技术以及协议来构建大规模网络软件的构架方式。REST意在说明,数据资源是可以被定义,被发布的,并且在此基础上将信息的交换变得简单并具有可扩展性。RESTful=REST+ful,既具有REST特征的设计风格。
3 API简单参数传递
这里提到的简单参数是指非结构化的参数,如一个数值、一个字符串这样的用简单变量进行接受处理的参数。
简单参数传递可以选择两种方式传递:(1)附加在路径上,表观现象如真实的资源路径无差异。(2)附加在资源路径的之后,按照标准的值对链条进行传参。前者称为@PathParam注解传参,后者称之为@QueryParam注解传参。
3.1 @PathParam注解
路径传参,就参数传递的形式而言是将参数嵌入到路径中,并从表观形态上与资源实体所对应的路径具有不可区分性。@PathParam语法形式:@PathParam(“路径中的参数名”)parameterType parameterName。在@PathParam中配置参数模板:@Path(“/path1/.../pathk/.../pathn”),示例:@Path(“/path/{name}/a/{age}/{gender}/myfile”)。在Class方法的参数列表中为相关参数配置@PathParam标注,进行参数赋值,示例:public String testPath(@Path Param(“age”) int age,@PathParam(“name”) String name,@PathParam(“gender”) String gender)。
@Path与@PathParam注解联合工作原理:当用户请求路径http://127.0.0.1/restful/test/path/张三/a/23/男/myfile时,请求路径与容器内注册模板进行匹配,发现@PathParam(“/path/{name}/a/{age}/{gender}/myfile”)匹配成功,接着进行路径参数解析,将name赋值为张三,age赋值为23,gender赋值为男,方法体代码正确执行后通过@Produces标注返回给用户的结果。
3.2 @QueryParam注解
Query是指URL中由“问号”引导出的值对参数链条。Query传参形式:http://host:port/path?Param1=value1&...¶mn=valuen。
@QueryParam语法形式:@QueryParam(“路径中的参数名”) parameterType parameterName。在Class方法的参数列表中为相关参数配置@QueryParam标注,进行参数赋值,示例:public String testQuery(@QueryParam (“age”) int age,@QueryParam(“name”) String name,@QueryParam(“gender”) String gender)。
@QueryParam注解工作原理:当用户请求路径http: //127.0.0.1/restful/test/query?name=张三&age=23& gender=男,请求路径与容器内注册模板进行匹配,发现public String testQuery(@QueryParam(“age”) int age,@QueryParam(“name”) String name,@QueryParam (“gender”) String gender)匹配成功,接着进行路径参数解析,将name赋值为张三,age赋值为23,gender赋值为男,方法体代码正确执行后通过@Produces标注返回给用户的结果。
4 Form表单参数传递
Form表单是一个容器,可将容器内的对象集合组织成参数集合,并向服务器发送这些参数。该容器内的常见可用于参数传递的对象如:input,select,textarea等。@Form语法:@Form parameterType parameterName。在Class方法中用法,示例:public String testForm(@Form FormRequestValues form)。与@Form匹配的parameterType类:需要在类的每个属性前加一个@FormParam注解,注解中填入表单中控件的name属性值。
5 加密算法
在这个过程中,我简单介绍一个信息交互过程“秘密的情书”,如图1所示。
5.1 算法A
Cipher1结构:C1,R1,C2,R2,…,Cn,Rn。Cipher1实例:72,01,75,02,74,03,73,04,其中Ci和Ri為ASCII的16进制形式,各自表示一个字节从Cipher1中获取key的各组成字节: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),下面给出实现代码。
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
明文结构:T1,T2,T3,T4,…,Tn-1,Tn,密钥结构:K1,K2,K3,K4,K5,K6,K7,将key视为明文,将自己的学号视为密钥,调用算法B,混合生成newKey:newKey[i]=(Ti xor Ki);注意:当Km从为密钥最后一个字节时,Km+1=K0,Km+2=K1,即密钥将重新从自己的首字节开始与明文按字节进行xor运算,直至计算完明文的最后一个字节为止。张华在得到newKey后,再次使用算法B加密自己的短消息,此时需要加密的短消息为明文,newKey为密钥,算法不变。注意在这个算法中,还将引入随机数。利用Java中的getBytes[]方法获取学号和明文的byte数组,接着生成随机数,将学号和明文的数组元素和随机数进行异或,将异或的结果和随机数作为最后newKey的结果。
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 結 论
计算机网络和Web技术的高速发展,为人们提供了便利,但随之而来的是信息的安全问题,为此有必要以一种高效的算法对信息进行加密,防止不法分子对信息进行解密或让其付出惨重代价,以此保证信息的安全性。在此,仅仅提出一个简单的加密模型,在后期随着知识的积累将对其进一步改进。
参考文献:
[1] 韩陆.Java RESTful Web Service实战(第二版) [D].北京:机械工业出版社,2018.
[2] 潘运平,王胜男,王晓川.基于WebService的整车物流管理信息系统研究 [J].武汉理工大学学报(信息与管理工程版),2013,35(5):710-713.
作者简介:徐彤(1998.12-),男,江西鹰潭人,本科,主要研究方向:软件工程理论与方法。