Rastgele token üreteci

Sırları tarayıcı CSPRNG'sinden üretir — hex, base64url ya da özel bir alfabe, ayrıca EFF diceware parola cümleleri — bit cinsinden entropiyle.

Üretiliyor…
Entropi192.0 bit

Onu bulmak için üç tahmin hızında ortalama süre. Aralarındaki fark, sırrın kendisinin yarattığı herhangi bir farktan daha büyüktür.

  • Hız sınırlayan bir oturum açmaya karşı — saniyede 10 tahmin10^49 yıl
  • Sızmış yavaş bir hash'e karşı (bcrypt, argon2) — 10⁴/s10^46 yıl
  • Sızmış hızlı bir hash'e karşı (SHA-256, MD5) — 10¹²/s10^38 yıl

64 karakterden çekiliyor; bu yüzden her biri 6.00 bit taşır.

Bu araç ne yapar

Sırlar üretir: tek savunması kimsenin tahmin edememesi olan değerler. Bir API anahtarı ya da bir veritabanı parolası için bir alfabe ve bir uzunluk seçin ya da bir kişinin yazması gereken bir şey için yayımlanmış bir kelime listesinden çekilen bir parola cümlesine geçin. Her sonuç tarayıcınızda üretilir ve gücünü dürüstçe tanımlayan tek sayıyla gösterilir.

Bu, bu sitedeki UUID üretecinden farklı bir iştir. Bir UUID benzersiz olmalıdır, ki iki kayıt asla çakışmasın; bir sır tahmin edilemez olmalıdır, ki bu daha güçlü bir gereksinim ve farklı bir başarısızlıktır. Tahmin edilebilir bir tanımlayıcı zararsızdır. Tahmin edilebilir bir sır açık bir kapıdır.

Rastgelelik nereden gelir

Buradaki her şey, işletim sisteminin entropi havuzundan tohumlanan tarayıcının kriptografik olarak güvenli rastgele üreteci crypto.getRandomValues'tan çeker — openssl rand ve /dev/urandom'un kullandığı aynı kaynak.

Alternatif, Math.random, bir güvenlik işlevi değildir ve asla öyle olduğunu iddia etmedi. Küçük bir iç durumu olan hızlı bir sözde-rastgele üreteçtir ve her güncel motorda o durum kısa bir çıktı dizisinden geri elde edilebilir; ondan sonra her geçmiş ve gelecek değer bilinir. Ondan kurulmuş bir token tam olarak gerçek biri kadar rastgele görünür; fark yalnızca biri bakmaya zahmet ettiğinde ortaya çıkar.

Makul bir soru, bir web sayfasının bir üretim sırrı üretmek için hiç doğru yer olup olmadığıdır. Üretimin kendisi sağlamdır: platform CSPRNG'sidir, sayfa statiktir ve hiçbir şey iletilmez. Düşünmeye değer parçalar çevresindekilerdir — panodan geçen bir sır diğer uygulamalarca okunabilir olabilir ve bir terminale yapıştırılan biri genellikle kabuk geçmişine düşer. Bunlar diğer herhangi bir yöntemle aynı düşüncelerdir.

Apaçık uygulamada gizlenen yanlılık

Rastgele baytları karakterlere çevirmek tek satırlık bir iş gibi görünür: bir bayt al, onu alfabe boyutuna göre modulo al, alfabeye indeksle. Boyutu 256'ya tam bölünmeyen her alfabe için ince biçimde yanlıştır ve çıktı bunun hiçbir işaretini vermez.

62 alfasayısal karakterle, 256 tam bölünmez: 62, 256'ya dört kez girer, 8 kalanla. O 8 kalan bayt değeri — 248'den 255'e — alfabenin ilk 8 karakterine geri katlanır; böylece bunların her biri 256'da beş şans alırken geri kalanı dört alır. İlk sekiz karakter diğerlerinden yaklaşık %25 daha olasıdır.

Çözüm reddederek örneklemedir: kalan kuyruğa düşen bir çekimi geri katlamak yerine at ve yeniden çek. 62 karakterlik bir alfabe için otuz iki çekimde yaklaşık bir fazladan çekime ve boyutları ikinin kuvvetleri olan ve dolayısıyla kuyruğu olmayan hex ya da base64url için hiçbir şeye mal olur. Bu araç reddeder; etki herhangi bir tek token'da görünmez, ki bu tam da belirtmeye değer olmasının nedenidir.

Tek dürüst ölçü olan entropi

Bit cinsinden entropi, eşit olasılıklı sırların uzayının ne kadar büyük olduğunu söyler: n bit, 2^n olasılık demektir. Toplanabilirdir ve karşılaştırması kolaydır ve o uzayı birinin ne kadar hızlı arayabileceği hakkında hiçbir şey söylemez — ki bu bir özelliktir, çünkü o kısım bir üretecin bilemeyeceği şeylere bağlıdır.

Aritmetik bilerek basittir. Her karakter log2(alfabe boyutu) bit katar ve her kelime log2(kelime listesi boyutu) katar; böylece:

  • Bir hex karakteri 4 bittir; böylece 32 karakterlik bir hex token'ı tam olarak 128 bittir — yazıya dökülmüş bir AES-128 anahtarı.
  • Bir base64url karakteri 6 bittir; böylece 22 karakter 128 biti ve 43 karakter 256'yı geçer.
  • Bir alfasayısal karakter yaklaşık 5,95 bittir; benzer görünenleri dışlamak alfabeyi 58'e ve karakteri 5,86'ya düşürür, ki bu her on ikide kabaca bir karakter uzunluğa mal olur.
  • EFF uzun listesinden bir kelime 12,925 bittir, çünkü listenin 7776 girdisi vardır, ki bu 6^5'tir — beş zar atışı.
  • EFF kısa listesinden bir kelime 10,34 bittir, 1296 girdiden, ki bu 6^4'tür.

Yaygın bir hedef 128 bittir, ki bu kaba kuvvetin yalnızca pahalı olmaktan çıkıp bir strateji olmaktan çıktığı yerdir. Bu, 32 hex karakteri, 22 base64url karakteri ya da EFF uzun listesinden 10 kelimedir.

Neden tek bir «kırma süresi» yok

Bir sırrın bir kırma süresi yoktur. Bir sır ile onu koruyan her ne varsa o çiftin bir süresi vardır ve koruyucu sırdan çok daha fazla önemlidir. Bir oturum açma formu üzerinden bulunması evrenin var olduğundan uzun sürecek aynı değer, tuzlanmamış bir SHA-256 olarak saklandıysa ve veritabanı sızdıysa bir öğleden sonrada düşer.

Bu yüzden tek bir sayı yerine üç hız gösterilir ve her biri adlandırılır:

  • Hız sınırlayan bir oturum açmaya karşı saniyede on tahmin. Bu, hizmetinizden geçmek zorunda olan bir saldırgan için gerçekçi tavandır.
  • Yavaş olacak şekilde kurulmuş, sızmış bir parola hash'ine karşı saniyede on bin tahmin — modern bir maliyetle bcrypt ya da argon2. Yavaşlık, o işlevlerin tüm amacıdır.
  • Parolalar için hiç tasarlanmamış, sızmış bir hash'e karşı saniyede bir trilyon tahmin. SHA-256 ve MD5 hızlı olacak şekilde tasarlanmıştır ve bir GPU takımı gerçekten çok hızlıdır.

Hızlar bilerek onun kuvvetlerine yuvarlanır. Daha kesin herhangi bir şey belirli bir saldırganın bir ölçümünü akla getirirdi; oysa yararlı bilgi, ilk satır ile son satır arasındaki on bir büyüklük mertebesidir. Bir sır üçünde de rahatsa, soru tam rakamlara gerek kalmadan çözülür.

Her rakam ortalamadır, ki bu tümü değil, uzayın yarısıdır — bir arama yanıtı ortalama olarak yarı yolda bulur. Ve bir milyon yılın ötesinde yanıt bir büyüklük mertebesi olarak verilir, çünkü «dört yüz trilyon yıl» kimsenin karşılaştırabileceği bir süre değildir. Evren yaklaşık 10^10 yaşındadır, ki bu, o kadar uzağa ulaşan satırlar için yararlı bir çapa oluşturur.

Parola cümleleri ve güçlerinin gerçekte nereden geldiği

Bir parola cümlesi tam olarak tek bir nedenle güçlüdür: büyük bir listeden birkaç kelime rastgele seçildi. Uzun olduğu için güçlü değildir ve dile benzediği için güçlü değildir. 7776 kelimelik bir listeden altı rastgele kelime yaklaşık 77 bittir; bir kişinin düşündüğü altı kelime çok daha az değerlidir, çünkü insanlar tekdüze seçmez ve bir saldırgan yaygın ifadeler hakkında sizin bildiğiniz aynı şeyleri bilir.

Buradaki iki liste EFF'ten gelir ve değişmeden indirilmiş, yayımlanmış diceware listeleridir. Burada derlenmiş listeler değildir ve bu önemlidir: birinin uydurduğu bir kelime listesinin boyutu bilinmezdir, diğer listelerle örtüşmesi bilinmezdir ve onun hakkında öne sürülen entropi iddiasını kontrol etmenin bir yolu yoktur.

  • Uzun listenin 7776 kelimesi vardır, beş zarın her atışı için bir tane ve kelime başına 12,925 bit verir.
  • Kısa listenin 1296 kelimesi vardır, dört zarın her atışı için bir tane ve kelime başına 10,34 bit verir. Kelimeleri daha kısadır — hiçbiri beş harften uzun değildir — ki bu, aynı güç için daha çok kelime gerektirme pahasına yazmayı kolaylaştırır.

Bir parola cümlesinde tekrarlanan bir kelime bir kusur değildir ve burada yeniden üretilmez. Her çekim bağımsızdır; böylece herhangi bir belirli kelime çifti tam olarak başka herhangi biri kadar olasıdır; tekrarları reddetmek olası parola cümlelerinin uzayını küçültür ve onları biraz daha güçlü değil, daha zayıf yapardı.

Her iki EFF listesi de bir avuç tireli girdi içerir — t-shirt, yo-yo, drop-down, felt-tip. Ayırıcı da bir tireyse, bunlardan birini içeren bir parola cümlesi kelimelerine belirsizlikten uzak biçimde geri bölünemez. Bu bir güvenlik sorunu değil, bir görüntü sorunudur ve ayırıcı olarak bir boşluk ya da bir nokta seçmek bunu tümüyle önler.

Entropiye mal olan seçenekler ve olmayan

Benzer görünen karakterleri dışlamak, gücü okunaklılıkla takas eder ve takas görünürdür. 0, O, I ve l'yi kaldırmak alfasayısal alfabeyi 62 karakterden 58'e alır — ki bu, tam olarak Bitcoin'in kullandığı base58 alfabesidir ve aynı nedenle. Her karakter 5,95'ten 5,86 bite düşer; böylece bir token aynı güçte kalmak için her on ikide yaklaşık bir fazladan karaktere ihtiyaç duyar. Bu, bir kişinin bir ekrandan okuyup başka bir yere yazacağı herhangi bir şey için genellikle buna değer.

Seçenek yalnızca bir şey ifade ettiği yerde sunulur. Hex ve base64url karakter kümeleri değil, kodlamalardır: alfabeleri bir belirtimle sabitlenmiştir ve 0'sız hex artık hex değildir — hiçbir şey onu çözemezdi.

Bir parola cümlesinin her kelimesini büyük harfle başlatmak hiçbir şey katmaz ve buradaki güç rakamı onu açtığınızda bilerek hareket etmez. Her seferinde uygulanan aynı dönüşümdür; böylece tek bir yeni olasılık yaratmaz: ifadenin büyük harfle başladığını bilen bir saldırgan tam olarak başladığı yerdedir. Seçenek, yardımcı olduğu için değil, parola alanları hâlâ bir büyük harf talep ettiği için vardır.

Bir uzunluk seçme

Bir makinenin işlediği herhangi bir şey için — API anahtarları, oturum token'ları, webhook sırları, veritabanı parolaları — tutumlu olmak için bir neden yoktur. 32 hex karakteri ya da 22 base64url karakteri 128 bit verir ve daha ileri gitmek bir yapılandırma dosyasında yalnızca baytlara mal olur.

Bir kişinin yazdığı herhangi bir şey için kısıt farklıdır ve bir parola cümlesi genellikle daha iyi şekildir. Uzun listeden altı kelime, on iki karakterlik rastgele bir paroladan daha güçlüdür ve ilk denemede doğru yapması çarpıcı biçimde daha kolaydır, ki bu kulağa geldiğinden daha önemlidir: insanların yanlış yazdığı bir sır, insanların not aldığı bir sırdır.

Sayısal bir kod için dürüst okuma şudur ki dört basamak 13 bittir ve hız sınırlamayan herhangi bir şey tarafından saniyeler içinde tüketilebilir. Bir PIN yalnızca çevresindeki kilitleme politikası nedeniyle güvenlidir, asla kendi gücü nedeniyle değil.

Sıkça sorulan sorular

Bir API anahtarı ne kadar uzun olmalı?
128 bit entropi ya da daha fazlasını hedefleyin, ki bu kaba kuvvetin bir strateji olmaktan çıktığı yerdir. Bu, 32 hex karakteri, 22 base64url karakteri ya da 256 bit istiyorsanız 43 base64url karakteridir. Yalnızca yazılımın işlediği bir değer için, daha uzun seçenek hiçbir şeye mal olmaz.
Bu, bir sırrı Math.random ile üretmekten daha mı güvenli?
Evet ve fark bir derece meselesi değil. Math.random, güncel motorların kısa bir çıktı dizisinden geri elde edilmesine izin verdiği küçük bir duruma sahip bir sözde-rastgele üreteçtir; ondan sonra üreteceği her değer bilinir. Bu araç, openssl rand'ın çektiği aynı kaynak olan platform CSPRNG'si crypto.getRandomValues'ı kullanır.
Neden tek bir «kırma süresi» göstermiyorsunuz?
Çünkü öyle bir sayı yok. Aynı sır, hız sınırlayan bir oturum açmanın arkasında ulaşılamazdır ve sızmış hızlı bir hash'in arkasında hızla düşer — on bir büyüklük mertebesi arayla. Tek bir rakam bir varsayım seçmek ve sonra onu gizlemek zorundadır ve okurlar varsayımı değil, sayıyı hatırlar. Üç adlandırılmış hız, varsayımı görebileceğiniz yere koyar.
Parola cümleleri rastgele dizelerden daha mı zayıf?
Hayır — güç yalnızca ne kadar büyük bir listeden kaç kelime çekildiğine bağlıdır ve ikisi de gösterilir. EFF uzun listesinden altı kelime yaklaşık 77 bittir, on karakterlik rastgele bir paroladan fazla. Bir parola cümlesini zayıflatan şey, kelimeleri kendiniz seçmenizdir, ki bunlar öyle değildir.
Benzer görünen karakterleri dışlamalı mıyım?
Bir insan sırrı bir ekrandan okuyup başka bir yere yazacaksa, evet: maliyet küçüktür ve yanlış okunan bir token bir destek kaydıdır. Onu yalnızca yazılım işleyecekse, bir neden yoktur. 0, O, I ve l'yi kaldırmak alfabeyi 62 karakterden 58'e alır, ki bu tam olarak base58 alfabesidir ve her on ikide yaklaşık bir karakter uzunluğa mal olur.
Bir parola cümlesini büyük harfle başlatmak onu daha güçlü kılar mı?
Hayır. Her seferinde uygulanan aynı değişikliktir; böylece parola cümleleri uzayına tek bir yeni olasılık eklemez. Buradaki entropi rakamı onu açtığınızda yerinde kalır, ki bu doğru davranıştır. Seçenek, bazı parola alanları bir büyük harfte ısrar ettiği için vardır.
Ürettiğim herhangi bir şey bir sunucuya gönderiliyor mu?
Hayır. Üretim tümüyle tarayıcınızda platform rastgele üretecini kullanarak çalışır, hiçbir şey yüklenmez ya da günlüğe yazılmaz ve ağ bağlantısı olmadan çalışır. Token'lar hiçbir yerde saklanmaz — sayfayı yeniden yüklemek yenilerini üretir ve eskiler yok olur.