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

เครื่องมือสร้างและตรวจสอบรหัสผ่านระดับมืออาชีพ ที่สร้างรหัสผ่านที่แข็งแรงและวลีผ่านที่จำง่าย รองรับการสร้างจำนวนมาก การรับประกันความไม่ซ้ำ การประเมินความแข็งแรง และการตรวจสอบตามนโยบาย มีคุณสมบัติที่มาจากแหล่งสุ่มที่ปลอดภัยทางด้านการเข้ารหัส ชุดอักขระที่ปรับแต่งได้ การกรองอักขระที่คล้ายกัน สถิติการไม่ซ้ำของชุดผลลัพธ์จำนวนมาก และฟังก์ชันคัดลอกด้วยคลิกเดียว รวมถึงตัวอย่างโค้ดหลายภาษา ฐานความรู้เกี่ยวกับรหัสผ่าน แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย และเครื่องมือทดสอบนโยบาย การดำเนินงานทั้งหมดเกิดขึ้นในเบราว์เซอร์ของคุณโดยตรง เพื่อรักษาความเป็นส่วนตัวและความปลอดภัย

เครื่องสร้างรหัสผ่าน

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

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

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

เครื่องสร้างพาสเฟรส

คำถูกเลือกอย่างสม่ำเสมอด้วยความสุ่มที่ปลอดภัยทางด้านคริปโต (Web Crypto) จากรายการคำที่ไม่คลุมเครือ 1271 คำ; การใช้ 6 คำจะให้เอนโทรปีประมาณ 62 บิต —— ใช้ 8 คำเพื่อความแข็งแรงมากขึ้น

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

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

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

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

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

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

วิธีการใช้งาน

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

คุณสมบัติ

  • แหล่งสุ่มที่ปลอดภัยทางด้านการเข้ารหัส (Web Crypto)
  • ชุดอักขระและกลุ่มสัญลักษณ์ที่ปรับแต่งได้
  • การกรองอักขระที่คล้ายกันและการยกเว้นแบบกำหนดเอง
  • การสร้างรหัสผ่าน 1-100 รายการแบบจำนวนมาก โดยทุกรายการไม่ซ้ำกันเสมอ
  • ตัวชี้วัดความแข็งแรงและเอนโทรปี
  • เครื่องทดสอบนโยบายและเครื่องมือสร้างวลีผ่าน
  • ตัวอย่างโค้ดหลายภาษา
  • คัดลอกด้วยคลิกเดียว (รายการเดียวหรือทั้งหมด)

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

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

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

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

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

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

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

  • ให้ความสำคัญกับการเพิ่มความยาวเพื่อเพิ่มความปลอดภัยสูงสุด
  • ใช้ชุดตัวอักษรหลายชุดเมื่อเป็นไปได้
  • การยกเว้นตัวอักษรจำนวนมากเกินไปจะทำให้แหล่งตัวอักษรลดลงและลดความปลอดภัย
นโยบายและการเปลี่ยนรหัสผ่าน
  • ให้ความสำคัญกับข้อกำหนดด้านความยาวและรายการบัญชีรหัสผ่านทั่วไป/รั่วไหล แทนที่จะใช้กฎองค์ประกอบที่ซับซ้อน
  • หลีกเลี่ยงการเปลี่ยนบ่อยตามนโยบายที่บังคับใช้ – เปลี่ยนเฉพาะเมื่อตรวจพบการละเมิดหรือความเสี่ยงเท่านั้น
  • ใช้รายการรหัสผ่านที่ถูกบุกรุกเพื่อบล็อกรหัสผ่านที่ใช้กันทั่วไปหรือรั่วไหล
Passphrase
  • ใช้คำสุ่ม 4–6 คำที่เชื่อมด้วยตัวคั่น เช่น lake-CARROT-planet_7
  • หลีกเลี่ยงคำพูดที่มีชื่อเสียง เนื้อเพลง หรือวลีทั่วไปอื่นๆ – ความสุ่มมีความสำคัญมากกว่า 'ความฉลาด'
  • สำหรับบัญชีที่สำคัญ ให้ใช้ตัวจัดการรหัสผ่านเพื่อเก็บรหัสผ่านสุ่มที่มีเอนโทรปีสูงอย่างแท้จริง
เคล็ดลับการตั้งค่าการสร้าง
  • "ต้องการชุดที่เลือกแต่ละชุด" ช่วยให้แน่ใจว่าอย่างน้อยจะมีตัวอักษรจากแต่ละหมวดหมู่ที่เลือกปรากฏขึ้น
  • "หลีกเลี่ยงความคล้ายคลึงกัน" ช่วยให้อ่านง่ายขึ้น แต่จะลดขนาดชุดตัวอักษรเล็กน้อย
  • สามารถจำกัดสัญลักษณ์ให้อยู่ในกลุ่มย่อยที่รองรับโดยระบบเป้าหมาย
การจัดเก็บข้อมูลฝั่งเซิร์ฟเวอร์
  • อย่าเก็บรหัสผ่านในรูปธรรมดาโดยเด็ดขาด – ใช้การแฮชที่ปลอดภัย (Argon2id/PBKDF2/Bcrypt) พร้อม salt
  • กำหนดค่าพารามิเตอร์ (หน่วยความจำ/เวลา/ต้นทุน) อย่างเหมาะสม และพิจารณาใช้ 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');
  // Rejection sampling removes modulo bias
  const limit = Math.floor(0x100000000 / pool.length) * pool.length;
  const buf = new Uint32Array(1);
  let out = '';
  for (let i = 0; i < length; i++) {
    do { crypto.getRandomValues(buf); } while (buf[0] >= limit);
    out += pool[buf[0] % 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) {
    // GetInt32 draws an unbiased value in [0, pool.Length)
    var chars = new char[length];
    for (int i = 0; i < length; i++) {
      chars[i] = pool[RandomNumberGenerator.GetInt32(pool.Length)];
    }
    return new string(chars);
  }
}
Rust (rand + getrandom)
use rand::rngs::OsRng;
use rand::Rng;

fn random_password(length: usize, pool: &str) -> String {
    // gen_range is uniform, so there is no modulo bias
    let chars: Vec = pool.chars().collect();
    (0..length)
        .map(|_| chars[OsRng.gen_range(0..chars.len())])
        .collect()
}

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