您的位置:68399皇家赌场 > 集群主机 > C# 生成轻便验证码

C# 生成轻便验证码

发布时间:2019-09-29 08:06编辑:集群主机浏览(159)

    网址登入总是会用到验证码,生成验证码对于C#来讲很轻便。因为有特别封装好的GDI 类能够直接调用使用具体代码如下

    Python用 KNN 实行验证码辨识的完成方式,pythonknn

    Java Web开拓进度中登入模块的验证码的落到实处格局总结,javaweb

    验证码及它的法力 验证码为自行区分Computer和人类的图灵测量试验的缩写,是一种有别于顾客是计算机的公家机关程序,这么些主题素材得以由Computer生成并裁判,不过必需独有人类本事解答.可避防卫恶意破解密码、刷票、论坛灌水、有效防守某些红客对某三个特定注册客户用特定程序暴力破解格局开展持续的记名。

    图像和文字验证码的原理 在servlet中随机生成三个钦命地点的验证码,平常为几位,然后把该验证码保存到session中.在通过Java的绘图类以图纸的款型出口该验证码。为了扩充验证码的安全等级,能够输出图片的还要输出郁闷线,最终在客户提交数据的时候,在服务器端将客商提交的验证码和Session保存的验证码举行相比较。

    兑现格局总括
    1 验证码生成类RandomCode
    RandomCode是三个生成验证码的工具类,援救德文和数字验证码,验证码包含俄语大小写和数组,在那之中国和南朝鲜文i、o和数字0、1因为易于暴发模糊,不包罗在生成验证码中。RandomCode补助出口jpg/bmp/png/gif图片格式的验证码。

    /** 
     * RandomCode验证码可以通过静态方法和实例方法生成。 
     * 
     * 静态方法: 
     * 
     * //生成长度为4的随机验证码 
     * String code = RandomCode.randomString(4); 
     * 
     * //把验证码图片输入到response输出流中 
     * //图片格式jpg 
     * OutputStream os = response.getOutputStream(); 
     * RandomCode.write(code, 120, 30, os, "jpg"); 
     * 
     * 实例方法: 
     * 
     * //实例化验证码类 
     * RandomCode rc = new RandomCode(4); 
     * 
     * //把验证码图片输入到response输出流中 
     * //图片格式jpg 
     * OutputStream os = response.getOutputStream(); 
     * rc.write(120, 30, os, "jpg"); 
     * 
     * //获取验证码字符串 
     * String code = rc.getCode(); 
     * 
     */ 
    public class RandomCode { 
      /** 
       * 随机验证码字符 
       */ 
      private static String base = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"; 
    
      /** 
       * 随机验证码长度 
       */ 
      private int length = 4; 
    
      /** 
       * 验证码字符串 
       */ 
      private String code; 
    
      /** 
       * 4位随机验证码 
       */ 
      public RandomCode(){ 
        this.code = RandomCode.randomString(this.length); 
      } 
    
      public RandomCode(int length){ 
        if(length > 0){ 
          this.length = length; 
        } 
    
        this.code = RandomCode.randomString(this.length); 
      } 
    
      /** 
       * 生成验证码图片 
       * @param width 图片宽度 
       * @param height 图片高度 
       * @return 
       */ 
      public BufferedImage toImage(int width, int height){ 
        return RandomCode.toImage(this.code, width, height); 
      } 
    
      /** 
       * 输出验证码图片,默认图片格式jpeg 
       * @param width 
       * @param height 
       * @param os 
       * @throws IOException 
       */ 
      public void write(int width, int height, OutputStream os) throws IOException{ 
        RandomCode.write(code, width, height, os, "jpeg"); 
      } 
    
      /** 
       * 输出验证码图片 
       * @param width 
       * @param height 
       * @param os 
       * @param format 图片格式,支持jpg/jpeg/bmp/gif/png 
       * @throws IOException 
       */ 
      public void write(int width, int height, OutputStream os, String format) throws IOException{ 
        RandomCode.write(code, width, height, os, format); 
      } 
    
      public int getLength() { 
        return length; 
      } 
    
      public String getCode() { 
        return code; 
      } 
    
      /** 
       * 静态方法 
       * 生成随机字符串 
       * @param length 字符串长度 
       * @return 随机字符串 
       */ 
      public static String randomString(int length){ 
        Random random = new Random(); 
        StringBuffer sb = new StringBuffer(); 
        for(int i = 0; i < length; i  ){ 
          sb.append(base.charAt(random.nextInt(base.length()))); 
        } 
        return sb.toString(); 
      } 
    
      /** 
       * 静态方法 
       * 输出验证码图片 
       * @param code 验证码字符串 
       * @param width 图片宽度 
       * @param height 图片高度 
       * @param os 图片输出流 
       * @param format 图片格式,支持jpg/jpeg/bmp/gif/png 
       * @throws IOException 
       */ 
      public static void write(String code, int width, int height, OutputStream os, String format) throws IOException{ 
        BufferedImage image = toImage(code, width, height); 
        ImageIO.write(image, format, os); 
      } 
    
      /** 
       * 静态方法 
       * 输出验证码图片,默认图片格式jpeg 
       * @param code 验证码字符串 
       * @param width 图片宽度 
       * @param height 图片高度 
       * @param os 图片输出流 
       * @throws IOException 
       */ 
      public static void write(String code, int width, int height, OutputStream os) throws IOException{ 
        write(code, width, height, os, "jpeg"); 
      } 
    
      /** 
       * 静态方法 
       * 字符串转成验证码图片 
       * @param code 验证码字符串 
       * @param width 验证码图片宽度,单位像素 
       * @param height 验证码图片高度,单位像素 
       * @return 
       */ 
      public static BufferedImage toImage(String code, int width, int height){ 
        //字体大小 
        int fontSize = (int)Math.ceil(height * 0.9); 
        if(fontSize < 20){ 
          fontSize = 20; 
        } 
    
        //字体在Y坐标上的位置 
        int positionY = (int)Math.ceil(height * 0.8); 
    
        int lenCode = code.length(); 
    
        //计算字体宽度 
        int fontWidth = width / (lenCode   2); 
    
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); 
        Graphics g = image.getGraphics(); 
    
        //图片背景随机颜色 
        g.setColor(randomColor(new Random(), 200, 250)); 
        g.fillRect(0, 0, width, height); 
    
        //设置字体 
        g.setFont(new Font("Times New Roman", Font.BOLD, fontSize)); 
    
        //在图片上画纵横交错的线,达到混淆效果 
        drawLines(g, width, height); 
    
        //在图片上画验证码 
        drawString(g, code, fontWidth, positionY); 
    
        g.dispose(); 
    
        return image; 
      } 
    
      /** 
       * 静态方法 
       * 在图片上话位子 
       * @param g 
       * @param code 验证码字符串 
       * @param fontWidth 字体宽度 
       * @param positionY 字体Y坐标 
       */ 
      private static void drawString(Graphics g, String code, int fontWidth, int positionY){ 
        int len = code.length(); 
        Random random = new Random(); 
        for(int i = 0; i < len; i  ){ 
          g.setColor(randomColor(random)); 
          g.drawString(String.valueOf(code.charAt(i)), (i   1) * fontWidth, positionY); 
        } 
      } 
    
      private static Color randomColor(Random random){ 
        int r = random.nextInt(255); 
        int g = random.nextInt(255); 
        int b = random.nextInt(255); 
        return new Color(r, g, b); 
      } 
    
      private static Color randomColor(Random random, int fc, int bc){ 
        if(fc > 255){ 
          fc = 255; 
        } 
    
        if(bc > 255){ 
          bc = 255; 
        }   
    
        int diff = bc-fc; 
        int r = fc   random.nextInt(diff); 
        int g = fc   random.nextInt(diff); 
        int b = fc   random.nextInt(diff); 
        return new Color(r,g,b); 
      } 
    
      /** 
       * 静态方法 
       * 画纵横交错的线 
       * @param g 
       * @param width 验证码图片宽度 
       * @param height 验证码图片高度 
       */ 
      private static void drawLines(Graphics g, int width, int height){ 
        Random random = new Random(); 
    
        //线的数量 
        int count = ((int)(Math.ceil(random.nextDouble() * 100)))   100;     
    
        for(int i = 0; i < count; i  ){ 
          int fc = 160   (int)Math.ceil(random.nextDouble() * 40); 
          int bc = 200   (int)Math.ceil(random.nextDouble() * 55); 
          g.setColor(randomColor(random, fc, bc)); 
    
          int x = random.nextInt(width); 
          int y = random.nextInt(height); 
          int xl = random.nextInt(width / 5); 
          int yl = random.nextInt(height / 5);       
          g.drawLine(x, y, x   xl, y   yl); 
        } 
      }   
    } 
    

    2 Servlet再次来到验证码 呼吁路线

    @WebServlet("/random/code/servlet") 
    public class RandomCodeServlet extends HttpServlet { 
      private static final long serialVersionUID = 1L; 
    
      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        // 验证码图片宽度,单位像素 
        int width = 120; 
        // 验证码图片高度,单位像素 
        int height = 30; 
        // 验证码图片格式 
        String format = "png"; 
        // 验证码字符长度 
        int len = 4; 
    
        // 设置图片格式 
        response.setContentType("image/"   format); 
    
        // 禁止浏览器缓存图片 
        response.setHeader("Pragma", "no-cache"); 
        response.setHeader("Cache-Control", "no-cache"); 
        response.setDateHeader("Expires", 0); 
    
        String code = RandomCode.randomString(len); 
    
        // 把图片输出到response输出流 
        RandomCode.write(code, width, height, response.getOutputStream(), format); 
      } 
    } 
    

    3 Strust2再次回到验证码

    public class RandomCodeAction extends ActionSupport { 
      private static final long serialVersionUID = -7515645222798283236L; 
    
      /** 
       * 获取验证码 
       */ 
      public void generateCode() { 
        HttpServletResponse response = ServletActionContext.getResponse(); 
    
        // 验证码图片宽度,单位像素 
        int width = 120; 
        // 验证码图片高度,单位像素 
        int height = 30; 
        // 验证码图片格式 
        String format = "png"; 
        // 验证码字符长度 
        int len = 4; 
    
        // 设置图片格式 
        response.setContentType("image/"   format); 
    
        // 禁止浏览器缓存图片 
        response.setHeader("Pragma", "no-cache"); 
        response.setHeader("Cache-Control", "no-cache"); 
        response.setDateHeader("Expires", 0); 
    
        String code = RandomCode.randomString(len); 
    
        // 把图片输出到response输出流 
        try { 
          RandomCode.write(code, width, height, response.getOutputStream(), format); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
    

    Struts2的验证码配置

    <package name="pkg-random-code" namespace="/" extends="struts-default"> 
      <action name="randomCode_*" method="{1}" class="com.rhui.web.action.RandomCodeAction"></action> 
    </package> 
    

    伸手路线

    4 SpringMVC再次来到验证码 伸手路线

    package com.rhui.web.controller; 
    
    import java.io.IOException; 
    
    import javax.servlet.http.HttpServletResponse; 
    
    import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    
    import com.rhui.util.RandomCode; 
    
    @Controller 
    @RequestMapping("/random/code") 
    public class RandomCodeController { 
      @RequestMapping("/generate.do") 
      public void generateCode(HttpServletResponse response) { 
        // 验证码图片宽度,单位像素 
        int width = 120; 
        // 验证码图片高度,单位像素 
        int height = 30; 
        // 验证码图片格式 
        String format = "png"; 
        // 验证码字符长度 
        int len = 4; 
    
        // 设置图片格式 
        response.setContentType("image/"   format); 
    
        // 禁止浏览器缓存图片 
        response.setHeader("Pragma", "no-cache"); 
        response.setHeader("Cache-Control", "no-cache"); 
        response.setDateHeader("Expires", 0); 
    
        String code = RandomCode.randomString(len); 
    
        // 把图片输出到response输出流 
        try { 
          RandomCode.write(code, width, height, response.getOutputStream(), format); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
    

    皇家赌场 1

    Web开采进度中登入模块的验证码的贯彻形式总括,javaweb 验证码及它的功力 验证码为机关区分计算机和人类的图灵测量试验的缩写,是一种...

    在PHP网址开采中,验证码能够使得地保险大家的表单不被恶心提交,可是即使不应用算式验证码要么汉字验证码,仅仅使用简便的字母可能数字验证码,那样的验证码方案真的安全呢?

     1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using System.Drawing; 8  9 namespace Ajax.验证码10 {11     public partial class Yanma : System.Web.UI.Page12     {13         private int CodeNum = 4;14         private string codeNum = "";15         protected void Page_Load(object sender, EventArgs e)16         {17             VeriflcationCode();18             HuaCode;19         }20 21         private void VeriflcationCode()22         {23             //生成验证码24             string AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";25             string[] StrChar = AllChar.Split(',');26             Random rd = new Random();27             string Codes = "";28             for (int i = 0; i < CodeNum; i  )29             {30                 Codes  = StrChar[rd.Next(0, 35)];31             }32             codeNum = Codes;33             Session["VerCode"] = Codes; 34         }35 36         private void HuaCode(string Codes)37         {38             int iwidth = (int)(Codes.Length * 17);//定义画布的宽39             System.Drawing.Bitmap images = new System.Drawing.Bitmap(iwidth, 25);//声明一个画布类,初始化图片的宽和高40 41             Graphics g = Graphics.FromImage;42             Font f = new Font("Arial", 14);//定义文字类型43             Brush b = new System.Drawing.SolidBrush(Color.Black);//文字颜色 黑色44             Brush r = new System.Drawing.SolidBrush(Color.FromArgb(166, 8, 8));//文字颜色 45             g.Clear(System.Drawing.ColorTranslator.FromHtml("#99C1CB"));//背景色46 47             char[] ch = Codes.ToCharArray();48             for (int i = 0; i < ch.Length; i  )49             {50                 if (ch[i] >= '0' && ch[i] <= '9')51                 {52                     //数字用红色显示 53                     g.DrawString(ch[i].ToString(), f, r, 3   (i * 14), 3);//将文字画出 文字、字体类型、字体颜色、字体间距、字体于顶部间距54                 }55                 else56                 {   //字母用黑色显示57                     g.DrawString(ch[i].ToString(), f, b, 3   (i * 14), 3);58                 }59             }60 61             //for循环用来生成一些随机的水平线62             Pen blackPen = new Pen(Color.Black, 0);63             Random rand = new Random();64             for (int i = 0; i < 5; i  )65             {66                 int y = rand.Next(images.Height);67                 g.DrawLine(blackPen, 0, y, images.Width, y);68             }69 70 71             System.IO.MemoryStream ms = new System.IO.MemoryStream();72             images.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);73             //history back 不重复 74             Response.Cache.SetNoStore();//这一句         75             Response.ClearContent();76             Response.ContentType = "image/Jpeg";77             Response.BinaryWrite(ms.ToArray;78             g.Dispose();79             images.Dispose();80         }
    

    前言

    事先做了贰个学园交友的应用软件,在这之中一个逻辑是通过顾客的教务系统来确认客商是一名在校博士,基本的主见是经过客商的账号和密码,用爬虫的点子来认同音信,不过十分的多教员职员员务系统都有验证码,那时候是通过本地服务器去下载验证码,然后分发给顾客端,然后让客户本人填写验证码,与账号密码一并交给给服务器,然后服务器再去模拟登陆教务系统以确认顾客能不能够登陆该教务系统。验证码确实让我们想使得客商赶快认证的主张未有了,可是及时也不能够,方今看了一些机械学习的剧情,认为对于绝大许多学校的那些极简单的验证码应该是可以用KNN这种措施来破解的,于是整理了弹指间思路,撸起袖子做起来!

    大家领悟轻便数字照旧字母验证码很轻便被破解,不过算式验证码依然汉语汉字验证码不轻松被破解,所以建议大家在运用验证码的时候,尽量用算式验证码依旧中文汉字验证码。

    效果为:皇家赌场 2

    分析

    皇家赌场 ,大家学园的验证码是那样的:皇家赌场 3,其实便是简约地把字符实行旋转然后加上部分虚亏的噪点变成的。我们要识别,就得逆行之,具体思路正是,首先二值化去掉噪点,然后把单个字符分割出来,最终旋转至标准方向,然后从这一个管理好的图形中选出模板,最后每一遍新来一张验证码就按同样格局管理,然后和这个模板实行相比,选拔判断距离近日的贰个模板作为其剖断结果(亦即KNN的思念,本文取K=1)。接下来按步骤举办表达。

    下边是本身写的三种验证码代码,有选拔的爱人能够参照他事他说加以考察下:

    本文由68399皇家赌场发布于集群主机,转载请注明出处:C# 生成轻便验证码

    关键词: 68399皇家赌场 PHP 验证码 简单

上一篇:linuxifconfig命令配置ip地址

下一篇:没有了