基于CANVAS与MD5的客户端生成验证码

好久没写东西,工作太忙了!不想服务端请求太多,搞了个这玩意儿,不过项目中并不会用上,还是使用服务端生成的机制(会安全多少呢?);我就想问个问题,除了图像识别来破解这样的简单验证码外,针对我这种例子,可以侦听到我的验证码吗?How?好吧,最简单的莫过于开发个浏览器插件,在页面注入脚本,修改我的所谓“md5的密码”的值。ヽ(*。>Д<)o゜

在线demo:verificationcod

<!DOCTYPE html><html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <input type="text" id="verificationCodeValue" /><button id="verificationCodeBtn">验证</button>
    <script type="text/javascript" src="md5.min.js"></script>
    <script type="text/javascript">
    var verificationCode="";
    function createVerificationCode (w,h){
        var codeLength = 4;
        var code=[];
        var random = new Array(0,1,2,3,4,5,6,7,8,9,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,
         ‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘);
         for(var i = 0; i < codeLength; i++) {
            var index = Math.floor(Math.random()*36);
            code.push(random[index]);
        }
        verificationCode = md5(code.join(""));
        console.log(verificationCode);
        var colors = ["red","green","brown","blue","orange","purple","black"]; 

        var codeCanvas = document.createElement("canvas");
            codeCanvas.width = w;
            codeCanvas.height= h;
        var ctx = codeCanvas.getContext("2d");
        ctx.font = "18px Arial";
        var cx = (w-20-codeLength*4)/(codeLength-1),cy = h/2+18/2;

        var deg,cos,sin,dg;
        for(var j=0;j<codeLength;j++){
            ctx.fillStyle =colors[Math.floor(Math.random()*colors.length)];
            //产生一个正负30度以内的角度值以及一个用于变形的dg值
            dg = Math.random()*4.5/10;
            deg = Math.floor(Math.random()*60);
            deg = deg>30?(30-deg):deg;
            cos = Math.cos(deg*Math.PI/180);
            sin = Math.sin(deg*Math.PI/180);
            ctx.setTransform(cos,sin+dg,-sin+dg,cos,(j?cx:10)*j+10,cy);
            ctx.fillText(code[j], 0,0);
            console.log(sin);
        }
        var img = document.getElementById("verificationCodeImg");
        if(!img){
            img = new Image();
            img.id="verificationCodeImg";
            img.onload= function(){
                document.body.appendChild(img);
            }
        }
        img.src=codeCanvas.toDataURL("image/png");

    }
   window.onload=function(){
           createVerificationCode(120,40);
           document.getElementById("verificationCodeBtn").onclick=function(){
               var vlu = document.getElementById("verificationCodeValue").value;
               if(vlu.length!=4){
                   alert("请输入正确的验证码");
               }else if(md5(vlu.toUpperCase())===verificationCode){
                   alert("正确的验证码!");
               }else{
                   alert("错误的验证码!");
                   createVerificationCode(120,40);
               }
           }
   }
    </script>
</body>
</html>

本文原创,转载注明出处...博客园 哥德

时间: 2024-08-26 00:27:34

基于CANVAS与MD5的客户端生成验证码的相关文章

KoaHub.JS基于Node.js开发的Koa 生成验证码插件代

ccap node.js generate captcha using c++ library CImg without install any other lib or software node-ccap -- node.js generate captcha using c++ library CImg. You can generate captcha without install any other libraries or software, only do npm install

android 客户端生成随机验证码的实现

由于项目中要用到验证码,自己找了些资料,试着就把这个验证码给做了出来,代码不是很多,比较的简单,下面给大家看看我是怎么实现该功能的: 源码地址下载:http://download.csdn.net/detail/u014608640/7268905 首先当然是写XML咯,贴上代码 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" andr

jQuery.qrcode.js客户端生成二维码,支持中文并且可以生成LOGO

描述: jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 ,使用它可以很方便的在页面上生成二维条码.此插件是能够独立使用的,体积也比较                 小,使用gzip压缩后才不到4kb.因为它是直接在客户端生成的条码, 所以不会有图片下载的过程,能够实现快速生成.它是基于一个多语言的类库封装的,也不依赖于其他额外的服务. 好处:使用jquery-qrcode的好处,不需要在服务器端生成多余的二维码图片,二维码直接通过JavaSc

一个基于Android系统的新闻客户端(一)

一.整体概述 在服务器端,通过对凤凰网的抓取存入数据库,客户端通过向服务器发送请求得到新闻. 服务端用WCF,宿主为window服务,客户端为Java写的安卓程序. 二.客户端 我在eclipse里新建了个Android项目,命名为MyNewClient,eclipse自动生成二个xml布局文件,如图: 其中,fragment_main.xml是新版的布局文件,暂时不会用,把它删掉. 新建xml文件,命名为activity_foot.xml,在这里我们要做app的底部,先上代码: <?xml v

生成验证码总结

java生成验证码总结 1.serialVersionUID    private static final long serialVersionUID = -8501285780349046114L;    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.相当于java类的身份证.主要用于版本控制. 2.BufferedImage类    --BufferedImage 子类描述具有可访问图像数据缓冲区的 Image.    TYPE_INT_RG

javaweb学习总结(九)—— 通过Servlet生成验证码图片

一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.response.study; 2 import java.awt.Color; 3 import java.awt.Font; 4 import java.awt.Graphics; 5 import java.awt.Graphics2D; 6 import java.awt.image.Buff

HttpServletResponse应用----生成验证码

1.1生成随机图片用作验证码 生成图片主要用到BufferedImage类 package gacl.response.study;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;im

转: 通过Servlet生成验证码图片

孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(九)—— 通过Servlet生成验证码图片 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.response.study; 2 import java.awt.Color; 3 import java.awt.Font; 4 import java.awt.Graphics; 5

使用RSA、MD5对参数生成签名与验签

在日常的工作中,我们对外提供的接口或调用三方的接口往往有一步生成签名或验签的步骤,这个步骤主要是验证调用方是 不是合法的以及内容是否被修改.比如:对于某些网上公开下载的软件,视频,尤其是镜像文件.如果被修改了可能会导致用不了 或者其他的问题,发布者镜像MD5算法计算一组数值.让下载的用户进行MD5数值对比,也就是MD5校验啦.由于MD5加密不可逆算, 如果数值一样,那就表示文件没有被修改的.反之,则被修改了. 接下来通过文字介绍.代码.运行结果的方式给大家介绍RSA.MD5生成签名和验签: 一.