摘要
目前实现网页登陆随机码的主流方案是将sessionid和认证码相关联存储在本地服务器进行认证这样有一定的存储代价,如果有恶意用户攻击可能会消耗很大的内存和数据库存储资源,本文提出一种无存储代价的登录随机码方案。
登录随机码的作用
1.防止网页爬虫抓取网页,对服务器的性能产生影响,爬虫识别认证码相对困难,从而达到禁止网页爬虫的抓取网页的功能。
2.借助随机码可以实现对密码的保护,认证过程中不需要将密码再传到服务器上,客户端将随机码和密码做HMAC计算结果返回服务器,服务器也进行相同计算如果结果相等则认证成功从而实现对密码的保护。
现有主流方案的实现
1.客户端登录认证前,服务器会分配给客户端sessionid和随机码图片并将sessionid和随机码关联起来存储到数据库。
2.客户端输入密码认证的时候需要将sessionid、输入的随机码、用户名、密码传到服务器中进行认证。
3.服务器通过传过来的sessionid查到对应的验证码判断随机码是否正确,正确在进行用户名和密码的认证。
现有主流方案的缺陷
从方案中不难看出,主流方案中服务器需要存储sessionid和随机码对应关系有一定的存储代价,如果有恶意攻击的话会放大这种存储代价。
本文方案
1.client 请求 server
2.server端生成随机码random,将当时时间戳timestamp,随机码random,服务器主密钥key计算HMAC值sum,将随机码图片image(random)、timestamp和sum值通过cookie传到客户端。
3.客户端输入随机码random_input传到服务器。
4.服务器首先判断timestamp是否新鲜,如果不新鲜认证失败,主要是为了防止重放攻击,然后用key、random_input、timestamp 计算HMAC值sum_input,判断sum_input和sum是否相等来判断是否认证成功。
本文方案通过所有认证参数都存储cookie没有存储在服务器端,而且很大的降低了服务器存储代价