เครื่องมือสร้างและตรวจสอบรหัสผ่าน
เครื่องมือสร้างและตรวจสอบรหัสผ่านระดับมืออาชีพ ที่สร้างรหัสผ่านที่แข็งแรงและวลีผ่านที่จำง่าย รองรับการสร้างจำนวนมาก การรับประกันความไม่ซ้ำ การประเมินความแข็งแรง และการตรวจสอบตามนโยบาย มีคุณสมบัติที่มาจากแหล่งสุ่มที่ปลอดภัยทางด้านการเข้ารหัส ชุดอักขระที่ปรับแต่งได้ การกรองอักขระที่คล้ายกัน สถิติการไม่ซ้ำของชุดผลลัพธ์จำนวนมาก และฟังก์ชันคัดลอกด้วยคลิกเดียว รวมถึงตัวอย่างโค้ดหลายภาษา ฐานความรู้เกี่ยวกับรหัสผ่าน แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย และเครื่องมือทดสอบนโยบาย การดำเนินงานทั้งหมดเกิดขึ้นในเบราว์เซอร์ของคุณโดยตรง เพื่อรักษาความเป็นส่วนตัวและความปลอดภัย
เครื่องทดสอบนโยบายรหัสผ่าน
- ความยาว
- อักษรพิมพ์เล็ก
- อักษรพิมพ์ใหญ่
- ตัวเลข
- สัญลักษณ์
- ต่อเนื่อง
- ทำซ้ำ
- รายการบล็อก
เครื่องสร้างพาสเฟรส
แผ่นสรุปการแฮชรหัสผ่าน
- ใช้ Argon2id พร้อมพารามิเตอร์ที่ต้องการความทนทานต่อหน่วยความจำอย่างเหมาะสม
- ใช้จำนวนรอบ (Time) ≥ 2 และขนาดหน่วยความจำ ≥ 64MB (ปรับแต่งตามสภาพแวดล้อม)
- เก็บค่า salt ที่ไม่ซ้ำกันสำหรับผู้ใช้แต่ละคน สามารถใช้ pepper ในระดับแอปพลิเคชันได้ตามความเหมาะสม
- เลือก SHA-256 หรือ SHA-512 โดยใช้จำนวนรอบ ≥ 210,000 (ปรับแต่งตามความต้องการ)
- ใช้ค่า salt ที่ไม่ซ้ำกันสำหรับการแฮชแต่ละครั้ง และรองรับการอัพเกรดพารามิเตอร์
- ย้ายไปใช้พารามิเตอร์ที่มีประสิทธิภาพสูงขึ้นเมื่อผู้ใช้เข้าสู่ระบบครั้งถัดไป
- ตั้งค่าค่า cost ระหว่าง 10–14 ขึ้นอยู่กับความสามารถของเซิร์ฟเวอร์
- หลีกเลี่ยงปัญหาการตัดทอน และแฮชรหัสผ่านทั้งหมด
- ใช้การจำกัดอัตราและการตรวจสอบบนจุดเชื่อมต่อการตรวจสอบยืนยันตัวตน
เครื่องประเมินความแข็งแรงของรหัสผ่าน
ความแข็งแรงประมาณจากเอนโทรปี: เอนโทรปี = log2(ขนาดกลุ่มอักขระ) × ความยาว กลุ่มอักขระที่ใหญ่ขึ้นและความยาวมากขึ้นจะช่วยเพิ่มความสามารถในการต้านทานการเดา
- อ่อนแอ: < 50 บิต —— เหมาะสำหรับการใช้งานครั้งเดียวหรือกรณีที่มีมูลค่าน้อย
- ปานกลาง: 50–80 บิต —— ยอมรับได้สำหรับกรณีที่มีความเสี่ยงต่ำ
- แข็งแรง: 80–110 บิต —— เป็นเป้าหมายเริ่มต้นที่แนะนำ
- ยอดเยี่ยม: > 110 บิต —— แนะนำสำหรับบัญชีผู้ดูแลระบบหรือบัญชีที่สำคัญ
หมายเหตุ: รูปแบบการโจมตีในโลกแห่งความเป็นจริงอาจแตกต่างกัน หลีกเลี่ยงการใช้รหัสผ่านซ้ำ และเปิดใช้งานการตรวจสอบยืนยันสองปัจจัย (MFA)
วิธีการใช้งาน
- เลือกความยาวและชุดอักขระ (ตัวพิมพ์เล็ก/ตัวพิมพ์ใหญ่/ตัวเลข/สัญลักษณ์); สามารถเปิดใช้งานตัวเลือก 'หลีกเลี่ยงอักขระที่คล้ายกัน' และ 'ต้องมีอย่างน้อยหนึ่งอันจากแต่ละกลุ่ม' ได้ตามต้องการ
- สำหรับการควบคุมที่ละเอียดยิ่งขึ้น: สามารถยกเว้นอักขระเฉพาะหรือกลุ่มอักขระ หรือเลือกชุดย่อยของสัญลักษณ์
- เลือกจำนวนรหัสผ่านที่ต้องการสร้าง แล้วคลิก สร้าง;ผลลัพธ์ชุดจะถูกลบข้อมูลซ้ำโดยอัตโนมัติ และสามารถคัดลอกทั้งหมดได้ในคราวเดียว
- หากต้องการตรวจสอบรหัสผ่านที่มีอยู่แล้ว ให้ใช้ 'เครื่องทดสอบนโยบาย'; หากต้องการสร้างวลีผ่านที่จำง่าย ให้ใช้ 'เครื่องมือสร้างวลีผ่าน'
คุณสมบัติ
- แหล่งสุ่มที่ปลอดภัยทางด้านการเข้ารหัส (Web Crypto)
- ชุดอักขระและกลุ่มสัญลักษณ์ที่ปรับแต่งได้
- การกรองอักขระที่คล้ายกันและการยกเว้นแบบกำหนดเอง
- การสร้างรหัสผ่าน 1-100 รายการแบบจำนวนมาก โดยทุกรายการไม่ซ้ำกันเสมอ
- ตัวชี้วัดความแข็งแรงและเอนโทรปี
- เครื่องทดสอบนโยบายและเครื่องมือสร้างวลีผ่าน
- ตัวอย่างโค้ดหลายภาษา
- คัดลอกด้วยคลิกเดียว (รายการเดียวหรือทั้งหมด)
ฐานความรู้เกี่ยวกับรหัสผ่าน
- เอนโทรปี ≈ ล็อก2(ขนาดชุดอักขระ) × ความยาว; โดยทั่วไปความยาวมีส่วนช่วยมากกว่า
- เป้าหมายที่แนะนำ: บัญชีทั่วไป ≥ 80 บิต; บัญชีที่มีสิทธิ์สูง/บัญชีทางการเงิน ≥ 110 บิต
- ชุดอักขระที่ใหญ่ขึ้น + ความยาวมากขึ้น → ต้านทานต่อการทายทายมากขึ้น
- การเพิ่มสัญลักษณ์โดยไม่มีเป้าหมายมีประสิทธิภาพน้อยกว่าการเพิ่มความยาว
- หลีกเลี่ยงรูปแบบที่คาดเดาได้ (เช่น คือ 'พิมพ์ตัวพิมพ์ใหญ่ตัวแรก + ตัวเลขท้าย!' เสมอ)
- ให้ความสำคัญกับความยาวที่เพียงพอก่อน แล้วจึงเพิ่มความหลากหลายของอักขระในระดับปานกลาง
- ลำดับแป้นพิมพ์ (เช่น qwerty), บล็อกที่ซ้ำกัน, วันเกิด/ปี เป็นเป้าหมายที่ง่ายสำหรับกฎการทายทาย
- การใช้ 'รหัสผ่านหลัก + ส่วนขยายชื่อเว็บ' จะสร้างการนำรหัสผ่านเดิมมาดัดแปลงใช้ซ้ำ, เพิ่มความเสี่ยงและทำให้รหัสผ่านทายทายได้ง่ายขึ้น
- ห้ามใช้รหัสผ่านเดียวกันกับเว็บไซต์หลายแห่งโดยเด็ดขาด
- ใช้ตัวจัดการรหัสผ่าน; ต้องมั่นใจว่ารหัสผ่านแต่ละเว็บไม่ซ้ำกัน; เปิดใช้งาน MFA สำหรับบัญชีที่สำคัญ
- หลีกเลี่ยงการส่งรหัสผ่านแบบข้อความธรรมดาผ่านช่องทางสาธารณะ; ใช้วลีผ่านที่ 'ออกเสียงได้' เมื่อจำเป็น
- เปลี่ยนรหัสผ่านทันทีและทำให้ไม่ซ้ำกันหากพบการรั่วไหลหรือการนำมาใช้ซ้ำ
- การผสมผสานของคำสุ่ม 4–6 คำ มักจะมีความปลอดภัยและจดจำได้ง่าย
- ผสานตัวคั่น ใช้ตัวพิมพ์ใหญ่ตัวแรก และใส่ตัวเลขเพื่อเพิ่มความปลอดภัยและอ่านง่ายขึ้น
- หลีกเลี่ยงการรวมวลีทั่วไป เนื้อเพลง หรือคำพูดที่มีชื่อเสียงโดยตรง
แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยของรหัสผ่าน
- ใช้ความยาวที่เพียงพอ: 16 ตัวอักษรขึ้นไปสำหรับบัญชีทั่วไป และ 24 ตัวอักษรขึ้นไปสำหรับบัญชีที่สำคัญ
- เพื่อความจดจำ ให้เลือกใช้ passphrase เป็นหลัก และใช้ตัวจัดการรหัสผ่านเพื่อเก็บรหัสผ่านที่สุ่มและมีความปลอดภัยสูง
- เปิดใช้งานการตรวจสอบยืนยันแบบหลายปัจจัย (MFA) เมื่อใดก็ตามที่เป็นไปได้
- อย่านำรหัสผ่านมาใช้ซ้ำในหลายเว็บไซต์ – แต่ละบัญชีควรมีรหัสผ่านที่ไม่เหมือนกัน
เอนโทรปีวัดความไม่สามารถคาดเดาได้ โดยอิงจากความยาวและขนาดของชุดตัวอักษร – ยิ่งมีบิตเอนโทรปีมากเท่าใด รหัสผ่านมักจะมีความปลอดภัยมากขึ้นเท่านั้น
- ให้ความสำคัญกับการเพิ่มความยาวเพื่อเพิ่มความปลอดภัยสูงสุด
- ใช้ชุดตัวอักษรหลายชุดเมื่อเป็นไปได้
- การยกเว้นตัวอักษรจำนวนมากเกินไปจะทำให้แหล่งตัวอักษรลดลงและลดความปลอดภัย
- ให้ความสำคัญกับข้อกำหนดด้านความยาวและรายการบัญชีรหัสผ่านทั่วไป/รั่วไหล แทนที่จะใช้กฎองค์ประกอบที่ซับซ้อน
- หลีกเลี่ยงการเปลี่ยนบ่อยตามนโยบายที่บังคับใช้ – เปลี่ยนเฉพาะเมื่อตรวจพบการละเมิดหรือความเสี่ยงเท่านั้น
- ใช้รายการรหัสผ่านที่ถูกบุกรุกเพื่อบล็อกรหัสผ่านที่ใช้กันทั่วไปหรือรั่วไหล
- ใช้คำสุ่ม 4–6 คำที่เชื่อมด้วยตัวคั่น เช่น lake-CARROT-planet_7
- หลีกเลี่ยงคำพูดที่มีชื่อเสียง เนื้อเพลง หรือวลีทั่วไปอื่นๆ – ความสุ่มมีความสำคัญมากกว่า 'ความฉลาด'
- สำหรับบัญชีที่สำคัญ ให้ใช้ตัวจัดการรหัสผ่านเพื่อเก็บรหัสผ่านสุ่มที่มีเอนโทรปีสูงอย่างแท้จริง
- "ต้องการชุดที่เลือกแต่ละชุด" ช่วยให้แน่ใจว่าอย่างน้อยจะมีตัวอักษรจากแต่ละหมวดหมู่ที่เลือกปรากฏขึ้น
- "หลีกเลี่ยงความคล้ายคลึงกัน" ช่วยให้อ่านง่ายขึ้น แต่จะลดขนาดชุดตัวอักษรเล็กน้อย
- สามารถจำกัดสัญลักษณ์ให้อยู่ในกลุ่มย่อยที่รองรับโดยระบบเป้าหมาย
- อย่าเก็บรหัสผ่านในรูปธรรมดาโดยเด็ดขาด – ใช้การแฮชที่ปลอดภัย (Argon2id/PBKDF2/Bcrypt) พร้อม salt
- กำหนดค่าพารามิเตอร์ (หน่วยความจำ/เวลา/ต้นทุน) อย่างเหมาะสม และพิจารณาใช้ pepper เมื่อจำเป็น
- จำกัดอัตราการพยายามเข้าสู่ระบบและตรวจสอบความล้มเหลว – ใช้ CAPTCHA หรือการตรวจสอบอุปกรณ์เมื่อมีการโจมตี
- ให้ความสำคัญกับ TOTP หรือคีย์ฮาร์ดแวร์ และหลีกเลี่ยง SMS เมื่อใดก็ตามที่เป็นไปได้
- รักษาขั้นตอนการกู้คืนให้ปลอดภัยด้วยการตรวจสอบยืนยันแบบหลายปัจจัยหรืออีเมล และบังคับใช้ระยะเวลารอคอย
- จัดเตรียมรหัสกู้คืนสำรองและส่งเสริมให้ผู้ใช้เก็บรหัสเหล่านี้ไว้อย่างปลอดภัย
- ใช้ระบบหน่วงเวลาแบบค่อยเป็นขั้นหรือการล็อคพร้อมการให้คะแนนความเสี่ยงของ IP/อุปกรณ์
- ใช้ WAF และการจำกัดอัตราการทำงานกับ API และแบบฟอร์มเข้าสู่ระบบ
- ตรวจสอบการโจมตีแบบ credential stuffing และส่งเสริมให้ผู้ใช้ใช้รหัสผ่านที่ไม่ซ้ำกัน
- ใช้ผู้จัดการรหัสผ่านที่น่าเชื่อถือสำหรับการจัดเก็บและการกรอกอัตโนมัติ
- อย่าแชร์รหัสผ่านในรูปแบบข้อความธรรมดาผ่านแชทหรืออีเมล; ใช้เครื่องมือจัดการความลับสำหรับทีม
- หากต้องจดรหัสผ่านลงไว้ออฟไลน์ ให้ปกป้องความปลอดภัยทางกายภาพ
วิธีสร้างรหัสผ่านผ่านภาษาโปรแกรมมิ่ง
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;
}
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))
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;
}
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
}
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();
}
}
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);
}
}
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);
}