验证码的作用就是为了强制人机交互,但是几乎所有的图片验证码都存在安全性问题,可以被机器轻易破解。
现在主流的验证码识别技术就是图像识别,如果说我做一个无图验证码是不是就能很大程度上防止机器破解呢?没错,就是canvas验证码。
其实现原理如下:
1、后端把生成的图片验证码转成base64,然后通过人工混淆加密,例如把base64里面的字符A替换成 一 ,然后在把g替换成A,加密和替换规则自己定。
2、前端通过ajax请求得到该加密后的base64,然后通过前后端约定的规则进行解密,此规则是前后端私下定好的,不用网络传输。
3、将解密后的base64放到canvas里面,这样用户就可以看到验证码了
4、将所有处理验证码的js自定义混淆加密
5、canvas原型里面的生成图片的方法删掉防止别人利用控制台将canvas转成图片
6、交给大家自由发挥
这种验证码的好处是:
1、无图机器无法识别
2、就算你得到那段加密后base64,也很难破解,因为你很难从加密后的js中找到base64的加密规则
3、加密混淆规则是自己定的没有规律可寻
4、此验证码灵活多变,就算被破,也能很快找到问题原因进行安全修复
你确定无图?随便一个 canvas 你右键点上去看看有没有保存为图片的选项。
只要放到客户端的东西,我写个截屏代码也可以给你截成图片。
别人不搞你并不是 canvas 验证码牛逼了,是你的站没有那个价值。
captcha 的流行趋势是行为判定代替模式识别,比如拖动滑块,甚至根据你在页面上的鼠标活动轨迹等等来判断。
觉得相对图片来说攻破难度上升了。毕竟需要用到JS,但是JS就太容易被破解了,你确定你的算法无法破解吗?
就我的想法而言,用验证码来防一些普通人就可以了,何必跟自己过不去呢?