CUID2 Üretici

Güvenli yeni nesil CUID2 tanımlayıcıları oluşturur

Adet
Uzunluk

Oluşturulan CUID2'ler

CUID2 oluşturmak için Oluştur'a tıklayın

CUID2 Nedir?

CUID2 (Çarpışmaya Dayanıklı Benzersiz Kimlik, sürüm 2), veritabanlarında, URL'lerde ve dağıtılmış sistemlerde birincil anahtar olarak güvenle kullanılabilen kısa, kriptografik olarak güvenli ve opak kimlikler oluşturmak için tasarlanmış CUID v1'in yeni nesil halefidir.

Selefinin aksine CUID2, oluşturma zamanı, ana bilgisayar makinesi veya oluşturan süreç hakkında herhangi bir bilgi açıklamaz. Her kimlik, rastgele bir küçük harfle başlayan ve ardından SHA-512'den türetilen base-36 karmasının geldiği görünürde rastgele bir dizedir. Varsayılan uzunluk 24 karakterdir, ancak depolama kısıtlamalarınıza göre 2 ila 32 karakter arasında yapılandırabilirsiniz.

CUID2, modern veritabanı araç kitlerince yaygın olarak önerilmektedir. Prisma, @default(cuid()) skaleri için varsayılan kimlik stratejisi olarak benimsemiştir; PlanetScale, Neon ve diğer sunucusuz veritabanı sağlayıcıları, CUID2'yi otomatik artırma tam sayıların sıralı tarama güvenlik açıklarından kaçındığı için tercih edilen kimlik formatı olarak açıkça listelemektedir.

CUID2 CUID v1'in Yerini Neden Aldı

2012'de Eric Elliott tarafından yayımlanan CUID v1, istemci tarafı kimlik oluşturmada düz UUID'lere göre önemli bir iyileştirmeydi. Ancak güvenlik araştırmacıları tasarımında iki temel sorun keşfetti:

  • Parmak izi: Her CUID v1 değerine gömülü ana bilgisayar parmak izi, kimlikleri gözlemleyebilen herkes için operasyonel meta verileri sızdırarak kimliği oluşturan makineyi veya süreci tanımlamak için kullanılabilirdi.
  • Tahmin edilebilirlik: CUID v1 monoton artan bir sayaç ve zaman damgası segmenti içerdiğinden, birkaç kimliği gözlemleyen bir saldırgan gelecekteki kimliklerin yaklaşık aralığını tahmin edebilir ve bu da kimlikleri tek yetkilendirme denetimi olarak kullanan API'lere yönelik numaralandırma saldırılarını etkinleştirebilirdi.
  • Kriptografik olmayan karma: CUID v1, modern güvenlik standartlarını karşılamayan basit ve kriptografik olmayan bir karma adımı kullandı.

Orijinal yazar Eric Elliott, CUID v1'i resmi olarak kullanım dışı ilan etti ve tüm bu sorunları çözmek için CUID2'yi sıfırdan yazdı. Yeni algoritma Web Crypto API (SHA-512) kullanır ve tüm deterministik bileşenleri ortadan kaldırarak her kimliği istatistiksel olarak diğerlerinden bağımsız kılar.

CUID2 Tasarım İlkeleri

Tahmin Edilemez
Zaman damgası, sayaç veya ana bilgisayar parmak izi gömülmez. Her kimlik, SHA-512 ile birleştirilen yeni bir kriptografik rastgele tuzdan oluşturulur.
Düz dağılım
SHA-512 özetinin base-36 kodlaması, neredeyse tekdüze karakter dağılımı üretir ve B-ağacı veritabanlarındaki indeksleme sıcak noktalarını azaltır.
Varsayılan olarak URL güvenli
Alfabe küçük harf a–z ve rakamlar 0–9 ile sınırlıdır — tire, alt çizgi veya karışık büyük/küçük harf yok — yüzde kodlaması olmadan URL'lerde güvenli kimlikler sağlar.
Yapılandırılabilir uzunluk
Uzunluğu (2–32) siz seçersiniz. Daha kısa kimlikler daha yüksek çarpışma olasılığı anlamına gelir; önerilen varsayılan 24, ~4 × 10³⁷ benzersiz değer verir.
Her zaman harfle başlar
İlk karakter her zaman rastgele bir küçük harftir, böylece CUID2 değerlerinin kaçınma olmadan geçerli HTML öğe kimlikleri ve CSS seçicileri olması sağlanır.
Sunucu gerekmez
CUID2 yalnızca tüm modern tarayıcılarda ve Node.js 15+'ta mevcut olan Web Crypto API'ye bağlıdır, bu nedenle kimlikler sunucuyla aynı güvenlik garantileriyle istemci tarafında oluşturulabilir.

CUID2 vs CUID v1 — Karşılaştırma

Aşağıdaki tablo, CUID2 ile artık kullanım dışı olan CUID v1 arasındaki temel farkları özetlemektedir. Şu anda CUID v1 kullanıyorsanız, CUID2'ye geçmeniz kesinlikle önerilir.

ÖzellikCUID2CUID v1
GüvenlikKriptografik (SHA-512)Kriptografik olmayan (parmak izi tabanlı)
Tahmin edilebilirlikOpak — meta veri sızdırılmazKimlikte zaman damgası + parmak izi görünür
UzunlukYapılandırılabilir (2–32 karakter)Sabit 25 karakter
ÖnekRastgele harf a–zHer zaman "c" ile başlar
DağılımDüz / tekdüzeMonoton artan segmentler
DurumAktif olarak bakımı yapılıyorOrijinal yazar tarafından kullanım dışı

CUID2 vs UUID v4 — Karşılaştırma

UUID v4, rastgele benzersiz kimlikler için baskın standarttır. CUID2, güvenlikten ödün vermeden UUID v4'e göre çeşitli pratik avantajlar sunar.

ÖzellikCUID2UUID v4
Varsayılan uzunluk24 karakter36 karakter (tirelerle)
URL güvenliEvet — küçük harf a–z + 0–9Kodlama gerektirir (tire içerir)
Özel uzunlukEvet (2–32)Hayır — her zaman 128 bit / 36 karakter
SıralanabilirHayır (tasarım gereği)Hayır (v4 rastgeledir)
Entropi kaynağıSHA-512 + Web CryptoCSPRNG
Karakter setiBase-36 (a–z, 0–9)Hex + tireler

Ana ödünleşme tanıdıklıktır: UUID v4, neredeyse her veritabanı, programlama dili ve API çerçevesi tarafından kutudan çıktığı gibi tanınan bir IETF standardıdır (RFC 4122). CUID2, büyüyen ancak evrensel olmayan desteğe sahip bir topluluk standardıdır. Dış sistemlerle birlikte çalışabilirlik öncelikliyse UUID v4'ü seçin; her iki ucu da kontrol ettiğinizde ve daha kısa, URL güvenli kimlikleri tercih ettiğinizde CUID2'yi seçin.

CUID2'yi Kimler Kullanıyor

CUID2, modern JavaScript ve TypeScript ekosisteminde hızlı bir şekilde benimsendi:

  • Prisma — en popüler TypeScript ORM, Prisma Schema v2+'deki @id alanları için @default(cuid()) ile CUID2'yi önerilen varsayılan olarak kullanır.
  • PlanetScale — belgeleri ve başlangıç şablonları, dağıtılmış MySQL platformlarındaki sıralı tarama performans sorunlarından kaçınmak için uygulama tarafından oluşturulan birincil anahtarlar için CUID2'yi önerir.
  • Drizzle ORM — sütun tanımları için yerleşik bir varsayılan yardımcı cuid2() sağlar.
  • tRPC şablonları — birçok topluluk tRPC + Prisma başlangıç şablonu, birincil anahtar stratejisi olarak CUID2 ile birlikte gelir.
  • T3 Stack — create-t3-app iskele aracı, oluşturulan şema dosyalarında CUID2 varsayılanlarıyla Prisma kullanır.

Kod Örnekleri

Resmi npm paketi @paralleldrive/cuid2 basit bir API sunar:

JavaScript (npm — @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"

Prisma şemasıyla CUID2 kullanmak:

Prisma Schema
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

npm paketi olmadan Node.js'de CUID2 oluşturmak (bu aracın tarayıcıda yaptığı gibi yalnızca Web Crypto API kullanarak):

Node.js (Web Crypto — no dependencies)
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"

Sıkça Sorulan Sorular

CUID2, CUID v1 ile geriye dönük uyumlu mudur?
Hayır. CUID2 kimlikleri, CUID v1 kimliklerinden tamamen farklı görünür. CUID v1 her zaman "c" harfiyle başlar ve sabit 25 karakter uzunluğundadır. CUID2 rastgele bir harfle başlar ve yapılandırılabilir bir uzunluğa sahiptir (varsayılan 24). Mevcut bir veritabanını taşırsanız, her iki formatı da işlemeniz veya tüm CUID v1 değerlerini değiştirmek için bir geçiş çalıştırmanız gerekir.
Hangi uzunluğu kullanmalıyım?
Varsayılan 24 karakter, çoğu uygulama için önerilen seçimdir. Devasa ölçekte bile istatistiksel olarak imkânsız çarpışmalar sağlayan yaklaşık 4 × 10³⁷ benzersiz değer sunar. Depolama kritikse ve veri kümeniz birkaç milyar kaydın altındaysa 16 karakter kullanın. Maksimum güvenlik marjı için 32 karakter kullanın.
CUID2 oluşturulma zamanına göre sıralanabilir mi?
Hayır — ve bu kasıtlıdır. CUID2, numaralandırma saldırılarını ve parmak izini önlemek için tüm zamansal bilgileri kasıtlı olarak atar. Zamana göre sıralanmış kimlikler gerekiyorsa, bunun yerine ULID veya UUID v7'yi göz önünde bulundurun. CUID2, sıralanabilirliği güvenlik ve opaklık için takas eder.
CUID2 vs NanoID — hangisini seçmeliyim?
Her ikisi de güvenli ve URL güvenlidir. NanoID varsayılan olarak 21 karakterle biraz daha kısadır ve karakter başına daha fazla entropi sağlayan daha büyük bir alfabe (A–Za–z0–9_-) kullanır. CUID2, CSS seçicilerde daha güvenli olan kısıtlı bir alfabe (a–z, 0–9) kullanır ve her zaman bir harfle başlar. Maksimum entropi yoğunluğu istiyorsanız NanoID'yi seçin; Prisma/ORM entegrasyonu veya CSS güvenli kimlikler önemliyse CUID2'yi seçin.
CUID2 URL güvenli midir?
Evet. CUID2 yalnızca küçük harfler (a–z) ve rakamlar (0–9) kullanır. Tire, alt çizgi, artı işareti, eğik çizgi veya eşittir işareti içermez, bu nedenle herhangi bir kodlama olmadan URL'lere, HTML id özelliklerine, CSS seçicilere ve dosya adlarına doğrudan gömülebilir.
CUID2'yi veritabanı birincil anahtarı olarak kullanabilir miyim?
Evet, ve bu birincil kullanım durumlarından biridir. CUID2, otomatik artırma tam sayıların sıralı modelinden (satır sayılarını sızdırabilir ve numaralandırmayı etkinleştirebilir) kaçınır, UUID'den daha kısadır (indeks alanından tasarruf sağlar) ve URL güvenlidir. Çoğu veritabanı onu VARCHAR(24) veya TEXT sütunu olarak depolar. ULID veya UUID v7'nin aksine, CUID2 değerlerinin zaman sıralı olmadığını unutmayın; bu nedenle sorgularınız ekleme sırası taramalarına büyük ölçüde bağlıysa sıralanabilir bir alternatifi tercih edebilirsiniz.