CUID2 Generator
Menghasilkan pengenal CUID2 generasi berikutnya yang aman
CUID2 yang Dibuat
Apa itu CUID2?
CUID2 adalah generasi kedua dari CUID, ditulis ulang dari awal dengan fokus pada keamanan kriptografi dan privasi.
Tidak seperti CUID v1 yang menyematkan timestamp secara terlihat, CUID2 menyembunyikan semua komponennya di dalam hash SHA3, menghasilkan string yang secara praktis tidak dapat diprediksi.
ID dimulai dengan prefix huruf yang dapat dikustomisasi (default c) diikuti dengan string base36 dari hash SHA3.
Mengapa CUID2?
CUID2 hadir sebagai respons terhadap kekhawatiran keamanan spesifik di CUID v1:
- Timestamp yang terekspos: CUID v1 mengungkapkan waktu pembuatan di awal setiap ID.
- Prediktabilitas: Dengan pengetahuan tentang struktur CUID v1, sebagian state internal dapat disimpulkan.
- Kurangnya keamanan kriptografi: CUID v1 tidak secara eksplisit menggunakan generator bilangan acak yang aman secara kriptografi.
CUID2 mengatasi masalah ini dengan menggunakan SHA3, CSPRNG, dan penyembunyian timestamp.
Prinsip Desain
CUID2 vs CUID v1
Perbandingan karakteristik kunci antara kedua generasi:
| Atribut | CUID2 | CUID v1 |
|---|---|---|
| Keamanan | Kriptografi (SHA3+CSPRNG) | Non-kriptografi |
| Prediktabilitas | Sangat rendah | Rendah (timestamp terekspos) |
| Panjang | Dapat dikustomisasi (default 24) | 25 karakter tetap |
| Prefix | Dapat dikustomisasi | Tetap 'c' |
| Distribusi | Terdistribusi merata | Bias timestamp |
| Status | Aktif & direkomendasikan | Usang |
CUID2 vs UUID v4
Perbandingan dengan standar UUID yang umum:
| Atribut | CUID2 | UUID v4 |
|---|---|---|
| Panjang Default | 24 karakter | 36 karakter |
| URL-safe | Ya | Ya (dengan tanda hubung) |
| Panjang Kustom | Ya | Tidak |
| Sortable | Tidak | Tidak |
| Entropi | Tinggi (SHA3) | Tinggi (CSPRNG) |
| Set Karakter | Alfanumerik huruf kecil | Hex + tanda hubung |
CUID2 menyediakan prefix alfabet yang terjamin dan panjang yang fleksibel dengan keamanan setara UUID v4.
Siapa yang Menggunakan CUID2?
CUID2 telah diadopsi oleh komunitas dan framework terkemuka:
- Prisma mendukung CUID2 sebagai tipe ID di field
@idmelalui@default(cuid()). - Komunitas Drizzle ORM mengadopsi CUID2 untuk ID default.
- Proyek SvelteKit dan Remix menggunakannya untuk ID sesi.
- Server API volume tinggi yang membutuhkan ID yang dapat dilacak dalam log.
- Aplikasi yang menyinkronkan di beberapa database atau region.
Contoh Kode
Instalasi dan penggunaan: pnpm add @paralleldrive/cuid2
import { createId } from '@paralleldrive/cuid2'
// Generate a single CUID2 (default length: 24)
const id = createId()
console.log(id) // e.g. "tz4a98xxat96iws9zmbrgj3a"
// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 16 })
const shortId = createShortId()
console.log(shortId) // e.g. "tz4a98xxat96iws9"Konfigurasi lanjutan:
model User {
id String @id @default(cuid())
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}Integrasi database:
async function generateCuid2(length = 24) {
const alphabet = 'abcdefghijklmnopqrstuvwxyz'
// Random prefix letter
const firstByte = crypto.getRandomValues(new Uint8Array(1))[0]
const firstChar = alphabet[firstByte % 26]
// Random 32-byte salt
const salt = crypto.getRandomValues(new Uint8Array(32))
const saltHex = [...salt].map(b => b.toString(16).padStart(2, '0')).join('')
// SHA-512 of timestamp + salt
const input = Date.now().toString(36) + saltHex
const hashBuffer = await crypto.subtle.digest(
'SHA-512',
new TextEncoder().encode(input)
)
// Encode hash bytes as base-36 string
const bytes = new Uint8Array(hashBuffer)
let hash = ''
for (let i = 0; i < bytes.length; i += 8) {
let chunk = 0n
for (let j = 0; j < 8 && i + j < bytes.length; j++) {
chunk = (chunk << 8n) | BigInt(bytes[i + j])
}
hash += chunk.toString(36)
}
return (firstChar + hash).slice(0, length)
}
// Usage
const id = await generateCuid2()
console.log(id) // e.g. "m7k3r9p2nxq8zt5a6cwj4bvd"