เครื่องมือสร้างและตรวจสอบรหัสผ่าน
สร้างรหัสผ่านที่แข็งแรงและวลีรหัสผ่าน รองรับการตรวจสอบแบบปริมาณมาก ความเป็นเอกลักษณ์ ความแข็งแรง และนโยบาย พร้อมตัวอย่างโค้ดหลายภาษาและความรู้เชิงปฏิบัติ
เครื่องทดสอบนโยบายรหัสผ่าน
ผลลัพธ์
- ความยาว
- ตัวอักษรพิมพ์เล็ก
- ตัวอักษรพิมพ์ใหญ่
- ตัวเลข
- สัญลักษณ์
- ลำดับต่อเนื่อง
- การทำซ้ำ
- รายการห้าม
การตรวจสอบทั้งหมดดำเนินการบนเบราว์เซอร์ของคุณเท่านั้น
เครื่องสร้างประโยครหัสผ่าน
คำถูกเลือกด้วยการสุ่มอย่างปลอดภัย (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)
- คัดลอกด้วยหนึ่งคลิก (แต่ละรายการ/ทั้งหมด)
ฐานความรู้เกี่ยวกับรหัสผ่าน
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);
}