首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 圖形驗證碼實現全解析:從隨機生成到圖片干擾

     編輯:程式設計綜合問答

核心實現步驟

  1. 隨機字元池構建:定義包含數字、大小寫字母的字元陣列/字串。
  2. 驗證碼生成:使用 Random 或 SecureRandom 從字元池抽取 N 個字元(通常 4-6 位)。
  3. 繪製基礎圖片:
    • 建立 Bitmap.createBitmap(width, height, Config.ARGB_8888)。
    • 獲得 Canvas,繪製背景色、干擾線、干擾點、噪點。
    • 設定 Paint(字型、大小、顏色、斜度、粗細),逐字元繪製於隨機位置、旋轉角度。
  4. 輸出與快取:
    • 將 Bitmap 壓縮為 JPEG/PNG 位元組陣列,回傳前端 ImageView 顯示。
    • 將驗證碼明文存入 SharedPreferences、MemoryCache 或後端 Session,並設定過期時間(如 60 秒)。
  5. 點擊刷新:給 ImageView 設定 OnClickListener,重新呼叫生成流程並更新圖片與快取。
  6. 驗證邏輯:用戶提交時,從快取取出明文(忽略大小寫)比對,驗證成功後立即清除快取防止重放。

關鍵程式碼片段

// 生成隨機驗證碼字串
private String generateCode(int length) {
    String pool = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";
    SecureRandom rnd = new SecureRandom();
    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++) sb.append(pool.charAt(rnd.nextInt(pool.length())));
    return sb.toString();
}

// 繪製干擾圖片
private Bitmap drawCaptcha(String code, int width, int height) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    canvas.drawColor(Color.WHITE);
    Paint paint = new Paint();
    paint.setTextSize(60f);
    paint.setAntiAlias(true);
    Random rnd = new Random();
    // 干擾線
    for (int i = 0; i < 5; i++) {
        paint.setColor(Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
        canvas.drawLine(rnd.nextInt(width), rnd.nextInt(height), rnd.nextInt(width), rnd.nextInt(height), paint);
    }
    // 字元
    for (int i = 0; i < code.length(); i++) {
        paint.setColor(Color.argb(255, rnd.nextInt(128), rnd.nextInt(128), rnd.nextInt(128)));
        paint.setTextSkewX(rnd.nextFloat() * 0.5f - 0.25f);
        canvas.drawText(String.valueOf(code.charAt(i)), 30 + i * 50, 70, paint);
    }
    return bitmap;
}

進階加強(可選)

  • 使用 Path 繪製貝茲曲線干擾線,提高機器識別難度。
  • 引入字型檔(.ttf)隨機切換字體風格。
  • 整合圖形驗證碼 SDK(如 Geetest、NetEase Captcha)獲得更強防禦。

安全提醒

純客戶端生成驗證碼 不可用於高安全場景(登入、支付、註冊),必須由後端生成、前端展示、後端驗證,防止繞過驗證邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved