传统图片验证算法的缺点及改进(原理篇)

    图片验证最常用在防恶意注册的场景,但传统图片验证方法的缺点在于需在服务器端维护这些随机生成的验证码字符串,所以实质上只是将恶意注册的影响从数据库转移到了内存,维护这个内存资源仍然会带来一些麻烦,包括定期清理,且仍要在一定程度上考虑防恶意获取验证码。

    下面介绍一种无需在服务器端维护验证码字符串的方法。

    我们假设服务器数据库用户表中的用户名字段的值必须是唯一的(这很常见),我们借助一个加密或者哈希算法,这样每个用户名对应的加密字符串在统计上也可以认为是唯一的。当新用户申请注册的时候,先提交这个用户名给服务器作有效性检查,如果数据库中没有这个用户名,则可注册,这时再用这个加密或者哈希算法将这个可用的用户名加密,返回这个加密的值的图像数据给客户端。(因为客户端不知道加密密钥,又不好破解加密算法,所以只能老老实实按图像值输入)

    随后客户端进入正式注册阶段,客户端将这个图像的对应字符串和刚才验证通过的用户名再次递交给服务器,服务器再次用同样的算法加密这个用户名,并将加密出的值和客户端传来的字符串相比较,如果相同,则向数据库提交注册。客户端也无法使用以前的验证数据来欺骗服务器,因为验证数据必须包含用户名,验证数据若有效则用户名必定已存在于数据库中,这样是不可能插入成功的。

    其实这个算法巧妙地借助了数据库某个字段值唯一性的特点,巧妙地复用了数据库的功能。

    优点:无需维护Session,对于服务器系统,越少维护这样的“全局变量”越利于减少出错几率。

    缺点:(可能,没测过,很有可能不是缺点)加密算法消耗的CPU时间要高于字典、hash算法(Session是需要通过字典或者hash算法获取数据的)

    只讲原理
原文地址:https://www.cnblogs.com/WYB/p/1232785.html