เครื่องมือสร้างและตรวจสอบรหัสผ่าน

สร้างรหัสผ่านที่แข็งแรงและวลีรหัสผ่าน รองรับการตรวจสอบแบบปริมาณมาก ความเป็นเอกลักษณ์ ความแข็งแรง และนโยบาย พร้อมตัวอย่างโค้ดหลายภาษาและความรู้เชิงปฏิบัติ

ตัวสร้างรหัสผ่าน

จำนวน
เลือกกลุ่มสัญลักษณ์
คำแนะนำ: สามารถยกเว้นโดยเลือกกลุ่มหรือคลิกที่อักขระโดยตรง
ผลลัพธ์

เครื่องทดสอบนโยบายรหัสผ่าน

ผลลัพธ์
  • ความยาว
  • ตัวอักษรพิมพ์เล็ก
  • ตัวอักษรพิมพ์ใหญ่
  • ตัวเลข
  • สัญลักษณ์
  • ลำดับต่อเนื่อง
  • การทำซ้ำ
  • รายการห้าม
การตรวจสอบทั้งหมดดำเนินการบนเบราว์เซอร์ของคุณเท่านั้น

เครื่องสร้างประโยครหัสผ่าน

คำถูกเลือกด้วยการสุ่มอย่างปลอดภัย (Web Crypto) รายการคำในตัวอย่างมีความยาวจำกัดเนื่องจากข้อจำกัดด้านขนาด

ตารางสรุปการแฮชรหัสผ่าน

Argon2id
  • ใช้ Argon2id และตั้งค่าพารามิเตอร์หน่วยความจำให้เหมาะสม
  • รอบเวลา ≥ 2, หน่วยความจำ ≥ 64MB (ปรับตามสภาพแวดล้อม)
  • เก็บ salt แยกสำหรับแต่ละผู้ใช้; สามารถใช้ pepper ที่ระดับแอปพลิเคชันได้
PBKDF2
  • เลือก SHA-256 หรือ SHA-512 โดยมีการวนซ้ำ ≥ 210k (ปรับตามความต้องการ)
  • ใช้ salt ที่ไม่ซ้ำกันสำหรับแต่ละแฮช; รองรับการอัปเกรดพารามิเตอร์
  • เปลี่ยนไปใช้พารามิเตอร์ต้นทุนสูงกว่าเมื่อผู้ใช้เข้าสู่ระบบครั้งถัดไป
BCrypt
  • ตั้งค่าต้นทุนที่ 10–14 ขึ้นอยู่กับความสามารถของเซิร์ฟเวอร์
  • หลีกเลี่ยงปัญหาการตัดต่อ; ทำการแฮชรหัสผ่านแบบเต็มรูปแบบ
  • จำกัดอัตราและติดตามการเข้าถึงจุดยืนยันตัวตน
อ้างอิง: NIST SP 800-63B, OWASP ASVS พารามิเตอร์ควรสอดคล้องกับสมรรถนะฮาร์ดแวร์และ SLO

การประเมินความแข็งแรงของรหัสผ่าน

ความแข็งแรงโดยประมาณมาจากการคำนวณเอนโทรปี: entropy = log2(ขนาดชุดอักขระ) × ความยาว ชุดอักขระที่ใหญ่ขึ้นและความยาวที่มากขึ้นจะเพิ่มความสามารถในการต้านทานการเดา

  • อ่อน: < 50 bits — เหมาะสำหรับการใช้งานครั้งเดียวหรือบริบทที่มีค่าต่ำ
  • ปานกลาง: 50–80 bits — ยอมรับได้ในบริบทที่มีความเสี่ยงต่ำ
  • แข็งแรง: 80–110 bits — เป้าหมายเริ่มต้นที่แนะนำ
  • แข็งแรงมาก: > 110 bits — เหมาะสำหรับบัญชีผู้ดูแลหรือบัญชีสำคัญ

คำเตือน: แบบจำลองการโจมตีจริงอาจแตกต่างกัน; หลีกเลี่ยงการใช้รหัสผ่านซ้ำและเปิดใช้งานการยืนยันตัวตนแบบหลายปัจจัย (MFA)

คำแนะนำการใช้งาน

  • เลือกความยาวและชุดอักขระ (ตัวพิมพ์เล็ก/ตัวพิมพ์ใหญ่/ตัวเลข/สัญลักษณ์);เปิดใช้งาน Avoid similar และ Require each หากจำเป็น
  • เมื่อต้องการควบคุมละเอียดยิ่งขึ้น: ระบุอักขระหรือกลุ่มอักขระที่ต้องการยกเว้น หรือเลือกกลุ่มสัญลักษณ์
  • คลิกที่ปุ่มสร้าง;หากต้องการผลลัพธ์หลายรายการ เปิดการสร้างแบบจำนวนมากและสามารถคัดลอกทั้งหมดด้วยเพียงหนึ่งคลิก
  • หากต้องการตรวจสอบรหัสผ่านที่มีอยู่ ให้ใช้ “เครื่องมือทดสอบนโยบาย”;หากต้องการวลีรหัสผ่านที่จดจำง่าย ให้ใช้ “เครื่องมือสร้างวลีรหัสผ่าน”

คุณสมบัติหลัก

  • แหล่งสุ่มปลอดภัย (Web Crypto)
  • ชุดอักขระและกลุ่มสัญลักษณ์ที่กำหนดได้
  • กรองอักขระที่คล้ายกันและการยกเว้นแบบกำหนดเอง
  • การสร้างแบบจำนวนมาก การรับประกันความเป็นเอกลักษณ์ และสถิติการลบซ้ำ
  • ดัชนีความแข็งแรงและเอนโทรปี
  • เครื่องมือทดสอบนโยบายและเครื่องมือสร้างวลีรหัสผ่าน
  • ตัวอย่างโค้ดหลายภาษา (JS、Python、PHP、Go、Java、C#、Rust)
  • คัดลอกด้วยหนึ่งคลิก (แต่ละรายการ/ทั้งหมด)

ตัวอย่างการสร้างรหัสผ่าน

แข็งแรง (Strong)
ความยาว 24 ตัว อุดมด้วยตัวพิมพ์ใหญ่/เล็ก/ตัวเลข/สัญลักษณ์
จดจำง่าย (Memorable)
ความยาว 16 ตัว อุดมด้วยตัวพิมพ์ใหญ่/เล็ก/ตัวเลข หลีกเลี่ยงอักขระที่คล้ายกัน

ฐานความรู้เกี่ยวกับรหัสผ่าน

1) ความแข็งแรงของรหัสผ่านและเอนโทรปี
  • เอนโทรปี ≈ log2(ขนาดชุดอักขระ) × ความยาว; ความยาวมักมีผลมากกว่า
  • เป้าหมายที่แนะนำ: บัญชีทั่วไป ≥ 80 บิต; บัญชีสิทธิ์สูง/การเงิน ≥ 110 บิต
  • ชุดอักขระที่ใหญ่ขึ้น + ความยาวมากขึ้น → ต้านทานการเดาได้ดีกว่า
2) ความยาว vs ความซับซ้อน
  • การเพิ่มสัญลักษณ์แบบไม่เลือก还不如เพิ่มความยาวให้มีประสิทธิภาพมากกว่า
  • หลีกเลี่ยงรูปแบบที่คาดเดาได้ง่าย (เช่น เริ่มต้นด้วยตัวพิมพ์ใหญ่ + ลงท้ายด้วยตัวเลข!)
  • เน้นให้มีความยาวเพียงพอก่อน แล้วจึงเพิ่มความหลากหลายของอักขระอย่างเหมาะสม
3) ข้อผิดพลาดทั่วไปและรูปแบบที่ควรหลีกเลี่ยง
  • ลำดับแป้นพิมพ์ (qwerty), กลุ่มซ้ำ, วันเกิด/ปี พ.ศ. เป็นต้น ซึ่งถูกโจมตีได้ง่ายโดยกฎทั่วไป
  • "รหัสหลัก + ส่วนท้ายของเว็บไซต์" เป็นการใช้ซ้ำในรูปแบบต่างๆ ซึ่งเสี่ยงสูงและคาดเดาได้ง่าย
  • ห้ามใช้รหัสผ่านเดียวกันบนเว็บไซต์หลายแห่ง
4) คำแนะนำในการจัดการรหัสผ่าน
  • ใช้ตัวจัดการรหัสผ่าน; ใช้รหัสผ่านที่แตกต่างกันสำหรับแต่ละเว็บ; เปิดใช้งาน MFA สำหรับบัญชีสำคัญ
  • หลีกเลี่ยงการส่งรหัสผ่านในรูปแบบข้อความธรรมดาผ่านช่องทางสาธารณะ; หากจำเป็น ให้ใช้ "รหัสผ่านที่อ่านออกเสียงได้"
  • หากพบว่ารหัสผ่านถูกเปิดเผยหรือใช้ซ้ำ ให้เปลี่ยนทันทีและทำให้เป็นรหัสผ่านที่ไม่ซ้ำกัน
5) คู่มือการสร้าง Passphrase
  • การรวมคำหลายคำ (4–6 คำ) มักจะแข็งแรงและจำง่าย
  • ผสมตัวแบ่งแยก ตัวพิมพ์ใหญ่ และตัวเลขเพื่อเพิ่มความแข็งแรงและความสามารถในการอ่าน
  • หลีกเลี่ยงการต่อตรงจากวลียอดนิยม เพลง หรือคำพูด nổi tiếng

คู่มือแนวทางปฏิบัติด้านความปลอดภัยของรหัสผ่าน

แนวทางที่ดีที่สุด
  • ใช้ความยาวเพียงพอ: บัญชีทั่วไป 16+ ตัวอักษร, บัญชีสำคัญ 24+ ตัวอักษร
  • หากต้องจดจำ ให้ใช้ฟีเจอร์พาสฟรีส; สำหรับรหัสผ่านแบบสุ่มและแข็งแรง แนะนำให้เก็บไว้ในตัวจัดการรหัสผ่าน
  • เปิดใช้งานการยืนยันตัวตนหลายปัจจัย (MFA) ให้มากที่สุดเท่าที่จะทำได้
  • อย่าใช้รหัสผ่านซ้ำระหว่างเว็บไซต์ต่างๆ; ทุกบัญชีควรมีรหัสผ่านที่ไม่ซ้ำกัน
เอนโทรปีและความแข็งแกร่ง

เอนโทรปีสะท้อนถึงระดับความไม่สามารถคาดเดาได้จากความยาวและขนาดของชุดอักขระ; จำนวนบิตของเอนโทรปียิ่งสูง รหัสผ่านยิ่งแข็งแกร่งโดยทั่วไป

  • เพิ่มความยาวให้มากที่สุดเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด
  • ใช้ชุดอักขระหลากหลายเมื่อเป็นไปได้
  • การตัดอักขระบางประเภทออกมากเกินไปจะลดขนาดชุดอักขระและลดความแข็งแกร่ง
นโยบายและการเปลี่ยนรหัส
  • เน้นความยาวและการห้ามใช้รหัสผ่านที่พบบ่อย/ถูกเปิดเผย แทนการกำหนดกฎโครงสร้างที่ซับซ้อน
  • หลีกเลี่ยงการบังคับเปลี่ยนรหัสบ่อยครั้ง; เปลี่ยนเฉพาะเมื่อมีการรั่วไหลหรือความเสี่ยง
  • ใช้รายการรหัสผ่านที่ถูกเปิดเผยเพื่อป้องกันการใช้รหัสผ่านที่พบบ่อยหรือถูกเปิดเผย
พาสฟรีส
  • ใช้คำสุ่ม 4–6 คำ เชื่อมด้วยตัวคั่น เช่น lake-CARROT-planet_7
  • หลีกเลี่ยงการใช้วลีที่พบบ่อย เช่น คำพูดชื่อดังหรือเนื้อเพลง; ความสุ่มสำคัญกว่าความฉลาด
  • สำหรับบัญชีสำคัญ แนะนำให้ใช้ตัวจัดการรหัสผ่านเพื่อเก็บรหัสผ่านแบบสุ่มที่มีเอนโทรปีสูงจริง
คำแนะนำการตั้งค่าการสร้าง
  • "Require each selected set" จะรับประกันว่าแต่ละกลุ่มจะปรากฏอย่างน้อยหนึ่งครั้ง
  • "Avoid similar" จะเพิ่มความอ่านง่าย แต่จะลดขนาดชุดอักขระเล็กน้อย
  • สามารถจำกัดสัญลักษณ์ให้อยู่ในชุดที่ระบบเป้าหมายรองรับ
การจัดเก็บบนเซิร์ฟเวอร์
  • ห้ามจัดเก็บรหัสผ่านในรูปแบบข้อความธรรมดา; ใช้แฮชที่แข็งแรง (Argon2id/PBKDF2/BCrypt) พร้อมเกลือ
  • ตั้งค่าพารามิเตอร์อย่างเหมาะสม (หน่วยความจำ/เวลา/ต้นทุน); หากจำเป็น ให้ใช้ pepper
  • จำกัดอัตราการลองเข้าสู่ระบบและตรวจสอบความพยายามที่ล้มเหลว; เมื่อถูกโจมตี ให้ใช้ CAPTCHA หรือการตรวจสอบอุปกรณ์
การยืนยันตัวตนหลายปัจจัยและการกู้คืน
  • ใช้ TOTP หรือคีย์ฮาร์ดแวร์เป็นอันดับแรก; หลีกเลี่ยง SMS โดย尽可能
  • ปกป้องกระบวนการกู้คืน: ใช้หลายปัจจัยหรือการยืนยันทางอีเมล และตั้งระยะเวลาพัก
  • จัดเตรียมรหัสกู้คืนสำรองและแนะนำให้ผู้ใช้จัดเก็บอย่างปลอดภัย
การป้องกันการโจมตีแบบบรูตฟอร์ซ
  • ใช้การหน่วงเวลาหรือล็อกแบบค่อยเป็นค่อยไป พร้อมคะแนนความเสี่ยงตาม IP/อุปกรณ์
  • กำหนด WAF/การจำกัดอัตราสำหรับ API และแบบฟอร์มการเข้าสู่ระบบ
  • ตรวจจับการโจมตีแบบ credential stuffing และสนับสนุนให้ผู้ใช้ใช้รหัสผ่านที่ไม่ซ้ำกัน
การจัดเก็บและการประมวลผลบนเครื่องผู้ใช้
  • ใช้ตัวจัดการรหัสผ่านที่เชื่อถือได้ในการจัดเก็บและเติมอัตโนมัติ
  • อย่าแชร์รหัสผ่านในรูปแบบข้อความธรรมดาผ่านแชทหรืออีเมล; สำหรับทีม ให้ใช้เครื่องมือจัดการความลับ
  • หากต้องบันทึกแบบออฟไลน์ ให้แน่ใจว่ามีความปลอดภัยทางกายภาพ
ข้อปฏิเสธความรับผิดชอบ: เครื่องมือนี้ใช้ Web Crypto ภายในเบราว์เซอร์เพื่อสร้างรหัสผ่าน; ไม่มีข้อมูลใดถูกส่งไปยังเซิร์ฟเวอร์

วิธีสร้างรหัสผ่านผ่านภาษาโปรแกรม

JavaScript(Web Crypto)
function randomPassword(length = 16, sets = {lower:true, upper:true, digits:true, symbols:true}) {
  const pools = {
    lower: 'abcdefghijklmnopqrstuvwxyz',
    upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    digits: '0123456789',
    symbols: '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
  };
  let pool = '';
  for (const k of Object.keys(sets)) if (sets[k]) pool += pools[k];
  if (!pool) throw new Error('No charset');
  const bytes = new Uint32Array(length);
  crypto.getRandomValues(bytes);
  let out = '';
  for (let i = 0; i < length; i++) out += pool[bytes[i] % pool.length];
  return out;
}
Python(secrets)
import secrets

def random_password(length=16, lower=True, upper=True, digits=True, symbols=True):
    pools = {
        'lower': 'abcdefghijklmnopqrstuvwxyz',
        'upper': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits': '0123456789',
        'symbols': '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
    }
    pool = ''.join(v for k, v in pools.items() if locals()[k])
    if not pool:
        raise ValueError('No charset')
    return ''.join(secrets.choice(pool) for _ in range(length))
PHP(random_int)
function random_password($length = 16, $sets = ['lower'=>true,'upper'=>true,'digits'=>true,'symbols'=>true]) {
    $pools = [
        'lower' => 'abcdefghijklmnopqrstuvwxyz',
        'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'digits' => '0123456789',
        'symbols' => '!@#$%^&*+-=_~`|/?()[]{}<>,.;:\'\"'
    ];
    $pool = '';
    foreach ($sets as $k => $on) if ($on) $pool .= $pools[$k];
    if ($pool === '') throw new Exception('No charset');
    $out = '';
    for ($i = 0; $i < $length; $i++) {
        $out .= $pool[random_int(0, strlen($pool)-1)];
    }
    return $out;
}
Go(crypto/rand)
package main

import (
  "crypto/rand"
  "math/big"
)

func RandomPassword(length int, pool string) (string, error) {
  out := make([]byte, length)
  for i := 0; i < length; i++ {
    nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(pool))))
    if err != nil { return "", err }
    out[i] = pool[nBig.Int64()]
  }
  return string(out), nil
}
Java(SecureRandom)
import java.security.SecureRandom;

public class Pw {
  static final String POOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
  static final SecureRandom SR = new SecureRandom();
  static String randomPassword(int length) {
    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++) {
      int idx = SR.nextInt(POOL.length());
      sb.append(POOL.charAt(idx));
    }
    return sb.toString();
  }
}
C#(.NET RandomNumberGenerator)
using System;
using System.Security.Cryptography;

public static class Pw {
  public static string RandomPassword(int length, string pool) {
    using var rng = RandomNumberGenerator.Create();
    var bytes = new byte[length];
    rng.GetBytes(bytes);
    var chars = new char[length];
    for (int i = 0; i < length; i++) {
      chars[i] = pool[bytes[i] % pool.Length];
    }
    return new string(chars);
  }
}
Rust(rand + getrandom)
use rand::rngs::OsRng;
use rand::RngCore;

fn random_password(length: usize, pool: &str) -> String {
    let mut bytes = vec![0u8; length];
    OsRng.fill_bytes(&mut bytes);
    let chars: Vec = pool.chars().collect();
    bytes
        .iter()
        .map(|b| chars[(*b as usize) % chars.len()])
        .collect()
}

fn main() {
    let pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*+-=_~`|/?()[]{}<>,.;:'\"";
    let pw = random_password(16, pool);
    println!("{}", pw);
}