王昊 康晓凤 卢志科 施润杰 黄成鑫
摘 要:目前许多网站使用验证码阻止黑客进行暴力破解登录口令,但是随着技术的发展验证码识别的难度及成本日益提升,传统的OCR(Optical Character Recognition)技术识别效率已不能满足需求。Vcode Identify平台使用TensorFlow建立深度学习模型并结合Web应用开发的一款验证码识别软件,使用该平台用户不仅可以通过调用接口或者上传文件的形式对验证码进行识别,而且还可以建立新模型并训练,进而可以识别新类型验证码,该软件使用简单、扩展性强。
关键词:深度学习;Python Web;验证码识别;Vcode Identify平台
中图分类号:TP315 文献标识码:A
Abstract:At present,many websites use verification codes to prevent hackers from performing brute-forced login passwords.However,the re-adoption of technology to develop verification codes increases the complexity and cost of recognition.The traditional OCR (Optical Character Recognition) technology recognition has been unable to meet efficiency needs.The Vcode Identify recognition platform uses TensorFlow to build a deep learning model.The verification code recognition software was developed in conjunction with a web application.Using this platform,users not only can identify verification codes by calling interfaces or uploading files but also can build and train new models to identify the new type of verification code.This system is simple to use and highly scalable.
Keywords:deep learning;python web;captcha breaking;Vcode Identify platform
1 引言(Introduction)
在如今互联网高速发展的时代,验证码识别作为一项基础验证手段,被广泛应用于网络环境中以辨别用户是真人或机器人,防止用户利用网络机器人自动注册、登录、注水,以及防止自动化脚本的等恶意行为,因此验证码识别技术的研究对研究互联网应用的安全性有着重要意义。目前验证码识别已经有了一定的技术基础,但是随着技术的发展,验证码的种类也愈加繁多。最一开始的验证码图片只有几个数字进行组合,后来就加入了英文字母和混淆曲线将其复杂化,甚至有的网站选择了中文字符的验证码,且对验证码进行颜色改变,位置旋转等方式使得识别越发困难。传统的OCR识别已不再能满足需求。而卷积神经网络在图像识别相比于传统验证码识别技术更具有独特优势[1,2],避免了烦琐的预处理过程。本平台为更好地提高验证码的识别效率,将算法优化,并将其与深度学习相结合,同时,为了更加方便于测试使用,将其与Web服务结合,便于在生产环境中人员调用接口直接使用获取验证码结果,使用简单。
2 Vcode Identify平台设计(Platform design of Vcode Identify)
2.1 CNN简介
卷积神经网络(Convolutional Neural Network,CNN),是目前深度学习中最常使用的神经网络模型之一,特别是在图像识别应用中已取得惊人表现。CNN在图像识别上的优势主要体现在:可减少计算中的权重(Weights)数量,在物体识别过程中能抵轻微扭曲和形变等干扰,可以自动学习和特征归纳,对物体的识别结果不受物体在图片中位置变动的影响。在图像处理过程,往往会将一张图像表示为一个或多个二维向量,若为RGB表示的彩色图片,三个颜色通道可看作为三张二维向量。以前的神经网络都是使用全连接方式,即输入层到隐藏层,以及隐藏层到输出层之间的神经元都是全连接的,使得参数量巨大,神经网络训练耗时过长,很难进行训练,而CNN则通过局部连接和权值共享等方式解决了这个难点[3]。
CNN的神经层主要有三种:卷积层(Convolutional Layer)、池化层(Pooling Layer)、全连接层(Fully-Connected Layer),识别过程由三种神经层协调发展。本平台的识别功能,在创建识别模型的时候,使用卷积神经网络构建。传统的Lenet的模型结构是:输入层—卷积层—池化层—卷积层—池化层—全连接层—全连接层—输出层。而本平台识别模型如图1所示,采用输入层—卷积层—池化层—卷积层—池化层—卷积层—池化层—局部連接层—全连接层—全连接层—输出层的结构。相比较传统模型进行了改进,多添加了一次卷积层—池化层的过程,并对每层dropout防止过拟合的问题,这主要是针对验证码类型进行的修改,提高了模型识别率[4]。
2.2 TensorFlow
TensorFlow是基于谷歌的神经网络算法库DistBelief研发的人工智能学习系统,2017年2月,正式发布了TensorFlow 1.0版。作为最受欢迎的深度学习框架之一,拥有丰富的算法库,高度的灵活性,真正的可移植性,多语言支持,完善的文档等特点。TensorFlow使用数据流图来表示计算任务,使用张量的形式表示数据,对图的节点可以进行数学运算,通过读写变量维护状态。本平台验证码识别功能使用Tensorflow框架来构建卷积神经网络模型。
2.3 Redis
Redis(Remote Dictionary Server)是一个开源的,且具有高性能的key-value存储系统。Redis具有轻量级,低延迟,高并发的优点。本平台使用Redis充当消息队列,通过Redis服务器使得web平台和验证码识别应用进行交互,具有较高性能,满足使用需求。
3 Vcode Identify平台实现(Build the platform of Vcode Identify)
本平台使用python语言编写,用CNN实现模型的建立、训练、识别,搭建web平台服务,使用Redis作消息队列,连接web服务和验证码识别应用,即可以分成三个层次架构:应用层、传输层和平台层。平台软件主要功能模块如图2所示,分为用户注册、用户登录、模型选择、识别检测还有生产接口。
3.1 验证码识别应用层
该层主要负责将验证码图片识别成对应验证码结果。传统的验证码识别通常需要将图片切割成几部分,使得每一张图片中只包含一个字符,然后训练单个字符模型,识别每个字符,再将每个识别出来的结果按原先顺序拼接成完整字符串,作为识别结果。而现在的字符型验证码很多字符都粘在一起,字符分布不均匀,很难做到将各个字符进行切割。操作流程如下:首先对彩色的验证码图片进行灰度化处理,接着将灰度化后的图像进行二值化,去除背景图的干扰,保留其中的字符。如果二值化后的图像还存在噪声,则需要再对二值化图像进行去噪处理。然后将单个字符切割完成分类保存建立训练集和测试集。使用训练集中的字符进行字符识别训练,当训练的准确率达到指定值,再用测试集进行测试。最后,使用此测试集进行验证码图片的字符识别,输出识别结果[5],如图3所示。
相比较传统验证码烦琐的识别流程,本软件采用的是基于卷积神经网络的验证码识别。简化了原先对图片进行预处理的人工干预过程,且能有效解决字符粘连,位置不定,噪声干扰的问题。特征提取和分类器训练可以通过卷积神经网络端到端的学习得到,算法结构简单、训练耗时大大减少,并且效果更快速准确。这种过程其实可以看作一个多标签分类过程,可以把每个字符当作一枚标签,并且顺序固定,只需要修改CNN最后一层的softmax,就可以实现多标签分类。使得可以直接输入图片进行多标签训练和识别,提高训练效率,降低训练成本[6,7]。
CNN训练模型在大量的人工标注的图片训练后,每个字符可以在输出层转换为对应字符集神经元。如该验证码类型为五个字符(数字+大小写字符),每个字符则可表现为62个神经元。对应变量:,,对应映射函数:
则每个字符对应62个神经元,5个字符,,建立神经元索引,,当得到预测字符串索引为c(0-61的常数)时,则对应字符对应关系为。
具体模型设计:首先根据字符集、是否存在干扰线以及字符个数确定该模型基础,获取大量该类型验证码图片进行标签标出验证码后作为神经网络训练数据,分为训练集、验证集和测试集三部分。然后通过修改CNN模型,根据上述多标签分类思想,设计多任务训练神经网络,直接将缩放后的彩色验证码图片标签化后放入输入层,将其作为样本训练,当训练准确率达到指定值(根据验证码的复杂度进行变通,简单的可到99%,复杂的95%就可以,过高的准确率耗费成本过高而且难以达到),再用测试集进行测试。最后,使用该测试集进行验证码图片识别并输出识别结果[8],如图4所示。
3.2 验证码识别传输层
该层主要负责用户与验证码识别应用进行交互,使用Redis充当消息队列,如图5所示启动Redis服务器后,通过web平台提供的接口,将用户请求的需要识别的验证码图片转换为base64文本传输给验证码识别接口,通过平台的识别接口,以json传参的方式上传,然后应用层接受并识别验证码图片,识别成功后返回结果json字符串,并将结果返回至平台。
3.3 验证码识别平台层
该层主要负责用户交互,选择了基于python平台的web应用开发框架Django,具有强大的数据库功能,具有较强的安全性,兼容性和可拓展性能,使用开源框架AdminLTE作为前端框架开发,界面友好,兼容性强。如图6所示,用户可以通过登录平台后可以看到目前该支持的验证码识别模型,以及该模型对应的模型编号和模型特点[9]。
如图7所示,在模型检测模块用户可以自己选择对应的模型,通过拖拽或者点击上传图片验证码的方式进行模型检测,如果符合该验证码识别模型则会识别出其验证码结果并将结果回显在页面中,否则会显示识别错误。识别的成功率与应用层的验证码的识别误差大小有关。
提供web接口作生成环境测试使用,可直接通过接口获取验证码图片对应验证码结果。用户可以登录平台后,获得对应的验证码识别接口。脚本如下所示,将需要识别的验证码图片进行base64加密成文本后,通過接口传输文本,平台即会返回此验证码结果,如图8所示。该功能适合生产环境,普通用户可以用来提高日常登录注册的友好性,安全从业人员可以将其添加为插件,便于进行安全测试,提高测试效率。
4 结论(Conclusion)
基于卷积神经网络的验证码识别,只需要构建一个合适的网络模型,再直接将彩色验证码图片转换为多标签分类样本进行训练。相比较原先的方法,节省了预处理的步骤,解决了目前预处理中很难对黏合字符进行分离、干扰因素影响过大的难点,从而大大降低了训练成本,节省了训练资源,且提高了识别准确率。因此将CNN技术应用于验证码识别中,具有較高的实用价值。再通过将其与web应用相结合,开发出了Vcode Identify平台软件,只需要导入对应模型的训练集,用户即可通过平台上传方式或者调用测试接口进行验证码识别,界面友好,使用简单,并具有较好的扩展性和实用性,具有良好前景。
参考文献(References)
[1] Jinlong Wu,Xiaolong Yin,Heng Xiao.Seeing permeability from images:fast prediction with convolutional neural networks[J].Science Bulletin,2018,63(18):1215-1222.
[2] Yuan-Chao Wang,Ming-Tao Li,Zhi-Chen Pan,et al.Pulsar candidate classification with deep convolutional neural networks[J].Research in Astronomy and Astrophysics,2019,19(09):119-128.
[3] Zhai Qi,Jiang Mingyan.Supervised learning of enhancing convolutional Hash for image retrieval[J].The Journal of China Universities of Posts and Telecommunications,2019,26(04):51-61.
[4] 徐星,宋小鹏,杜春晖.基于深度学习的验证码图像识别[J].测试技术学报,2019,33(02):138-142.
[5] 连晓岩.基于图像识别和神经网络的验证码识别[C].2011年中国智能自动化学术会议论文集(第一分册),2011:55-59.
[6] 毛燕.基于卷积神经网络的网上银行验证码识别[D].哈尔滨理工大学,2019.
[7] 王璐,张荣,尹东,等.粘连字符的图片验证码识别[J].计算机工程与应用,2011,47(28):150-153.
[8] 徐胤,袁浩巍,李智.基于卷积神经网络和TensorFlow的手写数字识别研究[J].上海电气技术,2018,11(01):31-34;61.
[9] 姜鹏.验证码识别及其Web Service的实现研究[D].南京理工大学,2007.
作者简介:
王 昊(1998-),男,本科生.研究领域:信息安全.
康晓凤(1978-),女,硕士,副教授.研究领域:信息安全.
卢志科(1998-),男,本科生.研究领域:信息安全.
施润杰(2000-),男,本科生.研究领域:信息安全.
黄成鑫(2001-),男,本科生.研究领域:信息安全.