วิธีใช้งาน
- ตั้ง “ความยาว” แล้วเลือก “หน่วย” ว่าจะนับเป็น “ไบต์ของข้อมูลสุ่ม” หรือเป็น “อักขระ” Base64 หากต้องการคีย์ ให้นับเป็นไบต์ โดย 32 ไบต์คือคีย์ขนาด 256 บิต
- ตั้ง “จำนวน” สตริงที่ต้องการ และเลือก “ตัวคั่น” ระหว่างสตริง ได้แก่ “ขึ้นบรรทัดใหม่” “จุลภาค” หรือ “ช่องว่าง”
- เลือก “รูปแบบ” เป็นแบบมาตรฐานหรือแบบปลอดภัยสำหรับ URL เมื่อใช้หน่วยไบต์ คุณยังปิด “แพดดิง” ได้ด้วยหากระบบปลายทางไม่ต้องการเครื่องหมาย =
- คลิก “สร้าง” เพื่อรับค่าชุดใหม่ แล้วกด “คัดลอกทั้งหมด” หรือ “ดาวน์โหลด” เพื่อบันทึกรายการ
ไบต์ อักขระ และเอนโทรปี
ความแข็งแรงของสตริงสุ่มวัดเป็นจำนวนบิตของเอนโทรปี ไบต์สุ่มแต่ละไบต์เพิ่มเอนโทรปี 8 บิต ดังนั้น 16 ไบต์จึงให้ 128 บิต และ 32 ไบต์ให้ 256 บิต Base64 เปลี่ยนเพียงวิธีเขียนไบต์เหล่านั้น โดยอักขระแต่ละตัวบรรจุข้อมูล 6 บิต และทุก 3 ไบต์จะกลายเป็น 4 อักขระ เครื่องมือจะแสดงเอนโทรปีของแต่ละสตริงไว้ให้ คุณจึงตรวจสอบได้ในทันที
เมื่อใช้หน่วยไบต์ เอาต์พุตจะถอดรหัสได้เป็นไบต์สุ่มตามจำนวนนั้นพอดี ซึ่งเป็นสิ่งที่คีย์และข้อมูลลับต้องการ เมื่อใช้หน่วยอักขระ คุณจะได้อักขระตามจำนวนที่กำหนดพอดี โดยแต่ละตัวถูกเลือกจากชุดตัวอักษร 64 ตัวด้วยโอกาสที่เท่ากัน ให้ใช้หน่วยนี้เมื่อระบบต้องการโทเค็นที่มีความยาวคงที่และจัดเก็บไว้เป็นข้อความ
| ไบต์ | อักขระ Base64 | เอนโทรปี | การใช้งานทั่วไป |
|---|---|---|---|
| 12 | 16 | 96 บิต | nonce (IV) ของ AES-GCM |
| 16 | 24 (22 เมื่อไม่มีแพดดิง) | 128 บิต | salt, โทเค็นเซสชันและโทเค็น CSRF, คีย์ AES-128 |
| 32 | 44 (43 เมื่อไม่มีแพดดิง) | 256 บิต | คีย์ AES-256 และ HMAC-SHA256, คีย์ลับ HS256, คีย์ API |
| 64 | 88 (86 เมื่อไม่มีแพดดิง) | 512 บิต | คีย์ HMAC-SHA512, คีย์ลับ HS512 |
ค่า Base64 แบบสุ่มนำไปใช้ที่ใดบ้าง
- คีย์ลับ JWT RFC 7518 กำหนดให้คีย์ HMAC ยาวอย่างน้อยเท่ากับเอาต์พุตของแฮช คือ 32 ไบต์สำหรับ HS256, 48 ไบต์สำหรับ HS384 และ 64 ไบต์สำหรับ HS512 บางไลบรารีใช้สตริงคีย์ลับตามที่เป็นอยู่ ขณะที่บางไลบรารีจะถอดรหัส Base64 ก่อน จึงควรตรวจสอบว่าไลบรารีที่คุณใช้ต้องการแบบใด ตัวถอดรหัส JWT ตรวจสอบลายเซ็น HS256 ถึง HS512 ได้ด้วยคีย์ลับทั้งสองแบบ และตัวสร้าง HMAC รับคีย์ได้ทั้งในรูปแบบข้อความ เลขฐานสิบหก และ Base64
- คีย์ของแอปพลิเคชัน ตัวอย่างเช่น Laravel เก็บคีย์เข้ารหัสลับขนาด 32 ไบต์ไว้ในไฟล์
.envในรูปAPP_KEY=base64:...ซึ่งเป็นรูปแบบเดียวกับสตริง 32 ไบต์ที่ได้จากเครื่องมือนี้ - Kubernetes Secret ค่าที่อยู่ใต้
dataต้องเป็น Base64 มาตรฐานที่มีแพดดิง สตริงที่สร้างด้วยหน่วยไบต์ รูปแบบมาตรฐาน และเปิดแพดดิงไว้ สามารถใส่ลงไปได้โดยตรง และ Pod จะได้รับไบต์สุ่มดิบ หากแอปพลิเคชันต้องการตัวข้อความ Base64 เอง ให้ใส่ไว้ใต้stringDataแทน - โทเค็นใน URL ลิงก์รีเซ็ตรหัสผ่าน รหัสคำเชิญ และโทเค็นอื่น ๆ ที่ส่งผ่าน URL ควรใช้รูปแบบปลอดภัยสำหรับ URL ซึ่งจะแทนที่
+และ/ด้วย-และ_ดูรายละเอียดได้ที่ Base64URL
ทำไมเครื่องมือนี้จึงเลือกใช้ crypto.getRandomValues แทนตัวสร้างเลขสุ่มทั่วไปอย่าง Math.random
Math.random() เป็นตัวสร้างเลขสุ่มอเนกประสงค์ที่ทำงานเร็ว แต่ไม่ได้ออกแบบมาให้ผลลัพธ์คาดเดาไม่ได้ และในเอนจินบางตัว สถานะภายในสามารถคำนวณย้อนกลับได้จากค่าเพียงไม่กี่ค่า เครื่องมือนี้ใช้ crypto.getRandomValues() ซึ่งเป็นตัวสร้างเลขสุ่มที่ปลอดภัยสำหรับงานเข้ารหัสลับ โดยได้ค่าตั้งต้น (seed) จากระบบปฏิบัติการ และเป็นแหล่งสุ่มประเภทเดียวกับที่อยู่เบื้องหลัง openssl rand และโมดูล secrets ของ Python ค่าทั้งหมดถูกสร้างบนอุปกรณ์ของคุณ และไม่มีการส่งหรือจัดเก็บไว้ที่ใด
สร้าง Base64 แบบสุ่มด้วยโค้ด
# Shell: ไบต์สุ่ม 32 ไบต์ในรูป Base64 (44 อักขระ)
openssl rand -base64 32
head -c 32 /dev/urandom | base64
# Python
import base64, secrets
base64.b64encode(secrets.token_bytes(32)).decode()
secrets.token_urlsafe(32) # ปลอดภัยสำหรับ URL ไม่มีแพดดิง 43 อักขระ
// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url'); // ปลอดภัยสำหรับ URL ไม่มีแพดดิง
// เบราว์เซอร์
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));
คำถามที่พบบ่อย
คีย์หรือข้อมูลลับแบบสุ่มควรยาวเท่าใด
16 ไบต์ (128 บิต) เพียงพอสำหรับค่าที่ต้องการเพียงแค่ไม่ซ้ำกันและเดาไม่ได้ เช่น ID เซสชัน โทเค็น CSRF และ salt ใช้ 32 ไบต์ (256 บิต) สำหรับคีย์ AES-256 คีย์ HMAC-SHA256 และคีย์ลับ HS256 และใช้ 64 ไบต์สำหรับ HMAC-SHA512 และ HS512
ผลลัพธ์เหมือนกับ openssl rand -base64 32 หรือไม่
= หนึ่งตัว และถอดรหัสได้เป็นไบต์สุ่ม 32 ไบต์ แน่นอนว่าค่าที่ได้จะแตกต่างกันทุกครั้งควรใช้หน่วยไบต์หรือหน่วยอักขระ
ใช้หน่วยไบต์เมื่อสตริงจะถูกนำไปถอดรหัส เช่น คีย์เข้ารหัสลับและ Kubernetes Secret ใช้หน่วยอักขระเมื่อระบบต้องการโทเค็นที่มีความยาวตามที่กำหนดพอดีและใช้ข้อความนั้นตามที่เป็นอยู่ สตริงจากหน่วยอักขระจะรับประกันได้ว่าถอดรหัสได้อย่างถูกต้องก็ต่อเมื่อความยาวเป็นพหุคูณของ 4 เท่านั้น
เมื่อใดจึงต้องใช้รูปแบบปลอดภัยสำหรับ URL
/ จะแบ่งพาธของ URL และ + จะกลายเป็นช่องว่างในสตริงคิวรีที่เข้ารหัสแบบข้อมูลฟอร์ม Base64 แบบปลอดภัยสำหรับ URL ใช้ - และ _ แทน และมักเขียนโดยไม่มีแพดดิงค่าที่สร้างขึ้นถูกจัดเก็บหรือส่งไปที่ใดหรือไม่
ไม่ ค่าทั้งหมดสร้างขึ้นด้วย JavaScript ในเบราว์เซอร์ของคุณ ไม่มีการส่งออกไป และจะหายไปเมื่อคุณออกจากหน้านี้ เมื่อนำค่าใดไปใช้เป็นข้อมูลลับจริงแล้ว ให้เก็บไว้ในโปรแกรมจัดการรหัสผ่านหรือระบบจัดเก็บข้อมูลลับ แทนที่จะเก็บไว้ในข้อความแชตหรือทิกเก็ต