随着信息技术的快速发展,互联网已成为人们生活中不可或缺的部分,而互联网环境中的安全问题也层出不穷。其中,用户敏感数据的安全性逐渐成为影响互联网健康发展的关键问题。著名Web应用安全组织OWASP(Open Web Application Security Project)将敏感数据泄露问题列为2013年十大互联网安全威胁之一[1]。
如今,越来越多的Web应用将用户敏感数据存储在服务器端,客户端仅存储少量数据用于本地交互。然而,Web服务器可能存在内存破坏漏洞、操作系统命令注入、服务器配置错误、文件类型混乱等问题,攻击者可以利用服务器端Web软件栈中的漏洞在Web服务器虚拟机中运行任意代码,这将导致Web服务器中的用户敏感数据(例如用户名、密码、信用卡信息、私信、电子邮件等)被攻击者读取或篡改。美国最大无线通信服务供应商Verizon在2013年的研究报告[2]中指出,54%的数据泄露问题源于Web服务器被入侵。而随着云端虚拟化技术的普及,Amazon、 RackSpace等公司提供的基于云端的Web服务器因其廉价实用而被越来越多的人选择,甚至很多情况下,同一台云端Web服务器虚拟机中同时运行着不同公司的不同应用服务,这些不同来源的服务使得云端环境中的信任关系变得更加复杂。由此可见,云端Web服务器的数据安全现状不容乐观,是业界现阶段不容忽视的问题。
本文针对云端Web服务器敏感数据泄露的问题提出了新的云端Web服务器敏感数据保护方法--SDPM(sensitive data protection method)。该方法结合数据加密和隔离执行的思想,在整个云端Web服务器不可信的假设下保证敏感数据的安全。
1 相关工作常见的云端服务器主要提供Web服务和数据库服务。相关敏感数据保护工作主要针对这两部分提出。
对于数据库服务器端的数据安全,文[3]首次提出并实现了支持直接在加密数据上执行查询的数据库系统CryptDB。该系统对不同类型的数据采用不同加密方案保存于数据库中,在执行查询语句时自动调整加密方案进行检索。而密钥只能通过认证用户密码导出,因此只有用户自己能访问明文数据。该方案确保了敏感数据不会因数据库服务器被入侵而泄露。Puttaswamy等人[4]针对第三方云计算平台的存储密集型敏感数据提出保护方案Silverline。该方案提供一系列工具完成自动识别并加密所有影响原应用功能的数据,并提出了一种全新的为指定数据子集分配加密密钥的密钥分配方案,利用该密钥为客户端提供透明的数据访问,防止恶意的应用通过用户密钥窃取敏感信息。
对于Web服务器端的数据安全,Parno等人[5]提出的Clamp架构为每个用户分配单独的虚拟机,提供完整的应用组件以实现隔离的执行环境。当用户的应用组件需要访问敏感数据时,须通过独立的访问控制组件进行权限检查,以增强对敏感数据的访问控制。Felt等人[6]提出了DIESEL,采用数据分离的概念对数据进行保护,通过细粒度的访问控制,对所有可以访问敏感数据的代码进行识别,同时对其进行访问权限控制。作为对基于传统用户权限检查的访问控制策略的补充,该数据分离方案对不同的代码模块进行安全策略检查,减少了敏感数据的泄露途径。
目前对于云端数据库服务器的敏感数据保护工作已有一个成熟的解决方案--CryptDB提出的新型调和加密算法可以有效地对数据库服务器中的数据进行保护,既保证了数据的机密性,又兼顾了索引、条件查找的效率。而Sliverline仅识别和加密应用中那些不参与运算的敏感数据,而放弃了对需要运算操作的敏感数据的保护。
相比之下,目前对于云端Web服务器的敏感数据保护工作尚无一个成熟的解决方案。Clamp面临着资源大量浪费的问题。DIESEL将访问权限与代码进行绑定,需要开发者进行过多干涉,同时整个工作需要信任过多的代码作为可信计算基[7]。
因此,本文针对云端Web服务器敏感数据泄露的问题提出了新的云端Web服务器敏感数据保护方法--SDPM,在整个Web服务器不可信的假设下保证敏感数据的安全。
2 SDPM本节首先对与SDPM相关的关键名词进行定义; 接着讨论了云端Web服务器可能遭受的数据泄露的威胁; 最后对SDPM所运用的数据加密与隔离执行思想进行了详细的阐述。
2.1 名词定义1) 敏感数据指在客户端与服务器交互的过程中,涉及用户隐私的数据。如用户名、密码、信用卡信息、私信、电子邮件等信息对应的客户端请求的特定字段。
2) 敏感逻辑指Web服务器执行环境中对敏感数据进行计算的函数,如字符串拼接、子串查找等。相应地,不参与敏感数据计算的函数被称为非敏感逻辑。
3) 可信计算基(trusted computing base,TCB)指在不影响安全性的前提下,系统安全所依赖的最小数量的软件与硬件的集合[8]。在设计系统时追求最小可信计算基能够尽可能减小系统的受攻击面(attack surface)[9]。
2.2 威胁模型云端服务器为应用提供业务逻辑、数据运算、数据存储等技术支持。常见的云端服务器主要由虚拟云平台(Hypervisor)、 Web服务器虚拟机和数据库服务器虚拟机几大部分组成,如图1所示。虚拟云平台搭建在硬件之上,提供物理设备虚拟化与权限访问控制支持。Web服务器和数据库服务器均运行在独立的虚拟机中,各虚拟机通过底部虚拟化层(Hypervisor层)统一管理。其中,Web服务器虚拟机由操作系统内核、 Web 服务器软件、脚本执行引擎和由该脚本语言开发的应用程序构成,主要负责业务逻辑和数据运算; 数据库服务器由操作系统内核和数据库构成,主要用于数据的存储和索引。
一个完整的云端服务数据通路首先由客户端向Web服务器发起请求并传递数据,接下来Web服务器解析数据并交给脚本执行引擎根据上层应用逻辑进行处理,其中可能伴随着与数据库服务器的交互,最后Web服务器将脚本执行引擎的执行结果返回客户端。因此,用户敏感数据(例如用户名、密码、信用卡信息、私信、电子邮件等)会暴露在Web服务器中。作为敏感数据的执行环境,Web服务器容易受到SQL注入、内存破坏漏洞、操作系统命令注入、服务器配置错误等攻击,这些攻击会造成服务器被迫安装和运行恶意程序,通过读取进程内存而获得敏感数据。图1中深色部分表示Web服务器虚拟机属于非可信环境。
通过上一节对相关工作的分析可知,如果仅关注存储环境(数据库服务器)中的数据安全,CryptDB已经给出十分成熟的解决方案。而目前缺乏有效的方法对执行环境(Web服务器)中的敏感数据进行保护。一方面,其中的Web软件栈中可能存在可被攻击者利用从而运行任意代码的漏洞; 另一方面,同一个环境里可能存在不同来源的互不信任的服务。因此,本文假设整个Web服务器虚拟机不可信,仅假设Hypervisor层可信。在实际使用中Hypervisor层是上层管理员无权控制的,并且目前已有技术可以确保Hypervisor层的完整性[10]。
2.3 方法详述总体上,SDPM结合数据加密和隔离执行两种思想保护敏感数据,如图2所示。一方面,基于以上假设,SDPM将Web服务器虚拟机负责用户认证的部分功能独立出来,连同数据加密功能一起,构成一个可信的认证密钥服务器虚拟机,使得敏感数据在暴露于非可信的Web服务器虚拟机之前被加密; 另一方面,SDPM将Web应用中的敏感逻辑分离出来,利用云端的虚拟化技术为其提供可信的执行环境,该可信环境位于提供虚拟化操作的Hypervisor层,与上层非可信的Web服务器虚拟机通过Hypercall进行交互。
1) 数据加密。
保证数据传递过程安全的有效方法是数据加密。密码学为加密信息的安全性提供了强有力的理论支持,可以证明使用足够强度的加密算法加密后,敏感数据密文即使被攻击者获得也无法获取其中的有效信息。如果使用认证加密算法,密文中还携带着数据完整性的校验信息,可以在解密过程中及时检测到信息篡改等攻击。
SDPM在上述可信认证密钥服务器虚拟机中完成敏感数据加密,该虚拟机经简化后只负责用户认证、敏感数据初始化加密以及信息传递。每当接收到来自客户端的HTTPS请求,可信认证密钥服务器虚拟机使用用户名、密码或SSH密钥等方式验证用户身份,通过身份认证后,利用该身份信息初始化相应的加密密钥。 在对客户端请求中开发者预先标注的敏感字段的信息进行解析,并调用预定义的接口对这些信息(敏感数据)加密后,数据流才真正进入非可信Web服务器虚拟机。于是,敏感数据在暴露于非可信Web服务器虚拟机之前被加密。
2) 隔离执行。
保证数据处理过程安全的有效方法是隔离执行。上述非可信的Web服务器虚拟机仍旧是Web应用的主要执行环境。不同于传统云端Web服务器虚拟机的是,为了给加密的数据在可信的隔离执行环境中提供与敏感逻辑功能相近的运算支持,SDPM将Web应用中的敏感逻辑分离到可信Hypervisor层执行。上述隔离执行方法需要分两个步骤,先识别Web应用中的敏感逻辑,再将这些敏感逻辑隔离到底层执行。
第一步,SDPM根据开发者提供的敏感参数名称标记敏感数据,再据此分析Web应用中对敏感数据明文进行计算的操作,最终识别出敏感逻辑(如图3)。
第二步,SDPM将Hypervisor层作为可信的隔离执行环境,并在其中提供敏感操作服务用于处理敏感数据密文。随后根据第一步的识别结果把原Web应用中的敏感逻辑人工插装为调用Hypervisor层敏感操作服务的调用接口(Hypercall),将其中的敏感逻辑隔离到Hypervisor层中执行。
每当收到来自Web应用的敏感操作请求,敏感操作服务立即解析Hypercall中的参数,对参数中的敏感数据进行解密和数据完整性检查。检查通过后,敏感操作服务将执行该Hypercall对应的敏感逻辑功能,对解密后的明文数据进行操作。操作完成后,对返回值进行认证加密,最后把返回值密文传递给上层非可信Web服务器虚拟机。
在对敏感逻辑进行隔离执行后,非可信Web服务器虚拟机中只存在加密后的敏感数据,即使虚拟机被入侵,攻击者也只能看到敏感数据的密文,强度足够的加密算法保证了攻击者无法仅凭密文得到数据中的有用信息。
3 SDPM的实现 3.1 基于认证加密算法的数据加密技术SDPM采用认证加密算法AES-GCM[11]对敏感数据进行加解密,使得敏感数据在传递过程中的机密性和完整性得到了有效保护。GCM模式由Viega和McGrew设计[12]。AES-GCM算法结合了主流AES加密算法的计数器模式[13]与认证算法中的Galois模式。其主要特点是,用于验证的Galois域乘法可以很容易地通过并行计算得到,从而比使用链接方式的认证算法(如CBC)有更高的吞吐量。鉴于该方法的普遍适用性,Intel推出了专门的PCLMULQDQ指令[14]使用硬件加速这一运算过程。
SDPM使用Intel处理器,在x86平台上参考手册[14]使用该硬件指令高效地实现了AES-GCM认证加密算法。在没有加密密钥的情况下,AES-GCM认证加密算法的强度在现有的计算能力下使其无法在有限的时间内破解。此外,加密的密钥位于特权级别的Hypervisor层,由于权限限制,攻击者在上层Web服务器虚拟机中无法获得密钥。
3.2 基于虚拟化的敏感逻辑隔离执行技术SDPM在实现敏感逻辑的隔离执行时主要分为敏感逻辑分析工具的实现与敏感操作服务的实现两部分。PHP是Web服务开发语言中占有率最高的语言[15],因此本文基于PHP应用对SDPM进行了实现。敏感逻辑分析工具利用数据流追踪技术,在PHP内核中对敏感数据触发的逻辑操作进行分析,辅助开发者对上层应用程序进行代码插装。敏感操作服务利用云端的虚拟化技术,在Hypervisor层中对敏感数据进行认证并解密,在隔离的环境中为数据提供敏感操作支持。
3.2.1 基于数据流追踪的敏感逻辑分析工具实现敏感逻辑分析工具以PHP内核扩展的形式发布。该工具根据开发者提供的敏感参数名称对敏感数据进行标记,利用动态数据流追踪技术,对敏感数据触发的逻辑进行分析,提取需要对敏感数据明文进行计算或字符串操作的操作码与函数名称,记录敏感数据动态传播过程的数据依赖。测试结束时将以上信息整理后输出。整个工具包含8 000行C代码作为PHP内核扩展运行,300行Python代码进行依赖分析,100行awk脚本进行结果统计。
在标记动态传播执行的过程中,针对不同的操作码,需要根据其语义对操作结果进行重新标记。对于劫持时主要关注的操作码,主要分为赋值相关、计算相关、逻辑操作相关、布尔判断相关等操作。对于所有劫持的操作,如果其对带有标记的操作数进行了修改,或者对带有标记的操作数标记进行计算产生了新的结果,那么意味着在加密执行的过程中这些操作需要敏感数据的明文才能正常运算,故将其识别为敏感逻辑,记录当前数据快照与当前PHP源程序代码行等信息,在分析结束后作为结果输出。
3.2.2 基于虚拟化的敏感操作服务的实现在敏感逻辑分析工具识别出应用中的敏感逻辑之后,SDPM的敏感操作服务模块则在Hypervisor层实现这些功能,支持敏感数据操作。本文采用开源的Xen虚拟化技术实现该敏感操作服务。由于非可信Web服务器虚拟机运行在非特权层,无权直接进行特权操作,因此所有的敏感操作通过Hypercall进行请求。SDPM在实现时对Hypercall的集合进行了扩展,使Hypervisor层支持更多的完成敏感操作服务相关的Hypercall。此外,Hypercall执行过程中实现了AES-GCM认证加密算法[11, 16]对参数进行完整性校验和解密,并对返回值进行加密。整个敏感操作服务约20 000行代码,远小于原PHP内核与上层系统内核的代码量,显著缩小了可信计算基。
3.3 PHP敏感逻辑隔离执行实例图4展示了一个PHP代码片段以及编译后的操作码序列,可以使用PHP内核插件vld[17]将编译后的操作码信息直观地显示出来。其中赋值语句编译为ASSIGN操作,数组元素的引用分为两步FETCH操作,首先使用FETCH操作根据数组名称(POST)取得内部的哈希表,然后使用FETCH_DIM操作用键值msg取出对应的值。字符串拼接操作使用CONCAT操作将两个字符串拼接。值得注意的是,除常量和空操作数以外,每个操作数代号都有一个由特殊符号构成的前缀,这表示该操作数的类型。在PHP内核中,“!”表示编译时变量,“$”表示普通变量,“~”表示临时变量,此外还有两种操作数类型是常量和未使用变量。
敏感逻辑分析需要对原始执行过程进行劫持。主要思路是在每个操作码执行时,读取其操作数,如果操作数含有敏感数据标记,那么在调用原始操作后根据数据流传播策略对结果进行标记; 若操作数中不含敏感数据标记,则直接调用操作码的原始处理函数。
在实际运行时,CONCAT将被替换为自定义的CONCAT_Hypercall。执行到该操作码时,控制流转移到底层Hypervisor层中,对加密的参数进行逐一验证和解密,并实现相应的敏感操作,最后加密返回值并将其返回上层非可信Web服务器虚拟机。
4 实验与结果分析本文选取了6个开源PHP应用作为实验对象,分别是PHPBB3(论坛,655KLOC)、 Wordpress(博客,253KLOC)、 AjaxRPG(在线聊天,11KLOC)、 Roundcubemail(邮件,191KLOC)、 OpenEMR(医疗管理系统,1752KLOC)、 HotCRP(论文审阅系统,44KLOC)。这些应用功能各不相同,代码复杂度与规模各有不同,涵盖了目前主流Web应用提供的业务。因此,实验结果可以较为客观地展示目前服务器端PHP应用的实际情况。
4.1 敏感逻辑识别结果与分析结合这些应用的具体功能和使用场景,对来自客户端的敏感数据参数名所对应的敏感数据值进行标记。论坛类、博客类、聊天类、邮件类应用主要对用户间的隐私消息、查找关键字、发表标题和内容几个字段进行了标记。对于管理类应用,主要对用户录入的隐私信息进行了标记,例如由医生录入的病人病情、疾病成因。对于在线审阅评价类应用,主要对评审的总结和意见进行了标记。
对敏感数据进行标记后,使用预先部署的敏感逻辑分析工具对PHP应用中包含的敏感逻辑进行 分析与识别,观察敏感数据在PHP应用中的传播 过程,统计相应的敏感操作的数量与每次操作具体参数类型信息。需要指出,每个PHP内核中的敏感操作都对应程序编译后执行时的中间操作码处理函数,以下所有的操作数量(敏感、全部)都是以操作码级别的粒度进行统计。
实验时使用Crawljax[18]对页面的链接与表单自动提交。Crawljax可以在客户端浏览器对页面中的动态DOM状态和事件进行自动遍历,可以设定对表单中各敏感数据域进行自动填充并提交。利用该工具可以尽可能多地触发服务器端PHP页面,从而使实验结果更有说服力。
在实验中对上述6个开源PHP应用进行如下信息的统计: 包含敏感逻辑的页面的数量、敏感逻辑与全部操作的数量以及二者的比值。由于应用在实际执行过程中会包含许多重复的操作,即一个敏感操作可能执行多次,而重复执行的次数与系统的整体开销有关,因此在实验中还对敏感逻辑与全部操作的数量进行了去重处理,统计出二者的类型数以及比值。
由表1可知,在上述6个PHP应用执行的过程中,包含敏感逻辑的页面数量都不多于16个,在这些“敏感”页面中,敏感数据触发的敏感逻辑所占的比例也均小于2%。
应用名称 | 敏感逻辑页面数量 | 敏感逻辑数量 | 全部操作数量 | 敏感逻辑占比/% | 敏感逻辑类型数量 | 全部操作类型数量 | 敏感逻辑类型占比/% |
PHPBB3 | 16 | 342 | 131 808 | 0.26 | 41 | 234 | 17.52 |
OpenEMR | 6 | 46 | 59 474 | 0.08 | 17 | 137 | 12.41 |
AjaxRPG | 1 | 28 | 2 044 | 1.37 | 9 | 86 | 10.47 |
RoundCubemail | 13 | 72 | 68 541 | 0.11 | 30 | 237 | 12.66 |
Wordpress | 15 | 111 | 440 504 | 0.03 | 38 | 236 | 16.10 |
HotCRP | 8 | 97 | 76 980 | 0.13 | 13 | 153 | 8.50 |
值得注意的是,非重复敏感逻辑的数量是开发者在应用SDPM时需要关注的,这些函数入口需要添加插装代码调用Hypercall陷入到敏感操作服务组件中执行。结果显示,对于几十万行级别的PHP应用,需要插装的位置仅有几十处; 对开发者来说,和整个工程的开发工作量相比,应用SDPM的人力开销是可以接受的。
4.2 SDPM运行开销对SDPM的实际运行开销进行评估,需要分别测量Web服务器在应用SDPM前后对客户端请求处理的响应时间。该时间间隔可以通过在服务器本机上模拟客户端请求进行观测。由于在本地进行请求,网络延时可以忽略不计,只需要记录客户端发出请求与收到响应的两个时间点,即可计算得到请求在服务器端处理的时间。结合上文对6个PHP应用的分析结果,对于一个应用来说,访问其每个触发敏感逻辑的请求对应的本地页面,计算在应用SDPM前后每个敏感请求的开销及所有敏感请求开销的平均值。
由图5可知,应用SDPM后,服务器端的处理能力略有下降,应用处理请求的时间开销在20%至40%之间。需要注意的是,应用的整体性能开销会远低于这一数值。因为包含敏感数据的请求只占所有客户端请求的一小部分,图中的开销只对这一小部分请求而言。用户在实际使用应用时会发起其他不包含敏感数据的请求,应用SDPM不会给这些请求带来额外开销。因此,实际使用中几乎体验不到明显的性能开销。
5 结束语本文针对云端Web服务器因被入侵而导致敏感数据泄露的问题提出了新的云端Web服务器敏感数据保护方法--SDPM,在云端Web服务器虚拟机不可信的假设下保证敏感数据的安全性。SDPM在传输时对数据进行认证加密以保证其机密性与完整性,在处理时利用云端的虚拟化技术为数据提供与上层虚拟机隔离的安全执行环境。以上两种方法相结合可以有效抵抗攻击者在应用层和系统层发起的攻击,即使攻击者入侵服务器虚拟机后窃取了敏感数据,也无法得到其中的有用信息。
本文基于PHP内核实现了针对PHP程序的数据流追踪工具,用来识别程序中的敏感逻辑。同时,本文基于Xen Hypervisor实现了敏感操作服务组件,为敏感数据提供基本的运算与操作支持。本文最终隔离到Hypervisor层中的敏感逻辑少于PHP内核代码量的3%,极大地缩小了整个系统的可信计算基。
最后,本文选取了6个开源PHP应用作为实验对象,详尽地统计并分析了敏感数据从标定到执行全过程的信息。本文完成了以数据流为核心的PHP程序执行过程的深入分析,得出了只有极小部分的逻辑与敏感数据处理有关的结论,还对应用SDPM运行开源PHP应用的开销进行了测量。
结合整个系统实现与部署的全过程,未来可以针对以下两方面进行完善: 1) 自动化部署。目前在部署时,开发者需要参考敏感逻辑分析工具的输出结果手工改写原始PHP应用中的敏感逻辑来完成对Hypervisor层敏感逻辑的调用,这带来一些人力开销。因此,未来可以利用开源编译器架构(例如LLVM[19])在编译时利用预先识别的敏感逻辑信息对敏感操作函数进行自动插装。2) 性能优化。可以在分析时识别连续的敏感逻辑,这样可以将这些敏感逻辑合并为一个敏感操作,直接在Hypervisor层执行,期间无需返回到上层,从而降低应用SDPM的开销。
[1] | The OWASP Foundation. Top 10 2013-A6-Sensitive Data Exposure[EB/OL]. (2013-02).https://www.owasp.org/index.php/Top_10_2013-A6-Sensitive_Data_Exposure. |
[2] | Verizon. 2013 Data Breach Investigations Report[EB/OL]. (2013). http://www.verizonenterprise.com/resources/reports/rp_data-breach-investigations-report-2013_en_xg.pdf. |
[3] | Popa R A, Redfield C, Zeldovich N, et al. Cryptdb: Protecting confidentiality with encrypted query processing [C]//Proceedings of the 23rd ACM Symposium on Operating Systems Principles. New York, NY: ACM Press, 2011: 85-100. |
[4] | Puttaswamy K P N, Kruegel C, Zhao B Y. Silverline: Toward data confidentiality in storage-intensive cloud applications [C]//Proceedings of the 2nd ACM Symposium on Cloud Computing. New York, NY: ACM Press, 2011: 10. |
[5] | Parno B, McCune J M, Wendlandt D, et al. CLAMP: Practical prevention of large-scale data leaks [C]//Security and Privacy, 2009 30th IEEE Symposium on. Piscataway, NJ: IEEE Press, 2009: 154-169. |
[6] | Felt A P, Finifter M, Weinberger J, et al. Diesel: Applying privilege separation to database access [C]//Proceedings of the 6th ACM Symposium on Information, Computer and Communications Security. New York: ACM Press, 2011: 416-422. |
[7] | Lampson B, Abadi M, Burrows M, et al. Authentication in distributed systems: Theory and practice [J]. ACM Transactions on Computer Systems (TOCS), 1992, 10(4): 265-310. |
[8] | Wikipedia. Trusted computing base [EB/OL]. (2002-02).http://en.wikipedia.org/wiki/Trusted_computing_base. |
[9] | Howard M. Attack surface: Mitigate security risks by minimizing the code you expose to untrusted users [EB/OL]. (2004-11). http://msdn.microsoft.com/en-us/magazine/cc163882.aspx. |
[10] | McCune J M, Parno B J, Perrig A, et al. Flicker: An execution infrastructure for TCB minimization [J]. ACM SIGOPS Operating Systems Review, 2008, 42(4): 315-328. |
[11] | Dworkin M. Recommendation for block cipher modes of operation: Galois/counter mode (GCM) and GMAC [R]. Gaithersburg: US Department of Commerce, National Institute of Standards and Technology, 2007. |
[12] | McGrew D, Viega J. The Galois/counter mode of operation (GCM) [EB/OL]. (2004).http://siswg.net/docs/gcm_ spec.pdf. |
[13] | Wikipedia. Block cipher mode of operation [EB/OL]. (2014-05). http://en.wikipedia.org/wiki/Block_cipher_mode_ of_operation. |
[14] | Gueron S, Kounavis M E. Intel? carry-less multiplication instruction and its usage for computing the GCM mode, Intel white paper [R]. 2012. |
[15] | W3Techs. Usage of server-side programming languages for websites [EB/OL]. (2014-04). http://w3techs.com/technologies/overview/programming_language/all. |
[16] | Gueron S. AES-GCM for efficient authenticated encryption: Ending the reign of HMAC-SHA-1? [C]//Workshop on Real-World Cryptography. Stanford: Stanford Univ, 2013. |
[17] | The PHP Group. vld Package Information [EB/OL]. (2003-09).http://pecl.php.net/package/vld. |
[18] | Crawljax. Crawling Ajax-based Web Applications [EB/OL]. (2007-10). http://crawljax.com. |
[19] | Computer Science Department at the University of Illinois at Urbana-Champaign. The LLVM Compiler Infrastructure [EB/OL]. (2002-06). http://llvm.org. |