Generator losowych ciągów Base64

Twórz losowe ciągi Base64 za pomocą bezpiecznego generatora liczb losowych wbudowanego w przeglądarkę. Ustaw długość w bajtach lub znakach, wygeneruj do 1000 ciągów naraz i wybierz wariant standardowy lub bezpieczny dla URL.

Działa w całości w przeglądarce. Nic nie jest wysyłane.

Jak używać

  1. Ustaw „Długość” i w polu „Jednostka” wybierz, czy oznacza ona „Bajty losowych danych”, czy „Znaki” Base64. W przypadku kluczy wybierz bajty: 32 bajty to klucz 256-bitowy.
  2. W polu „Liczba” podaj, ile ciągów potrzebujesz, i wybierz separator między nimi: „Nowy wiersz”, „Przecinek” lub „Spacja”.
  3. Wybierz wariant „Standardowy” lub „Bezpieczny dla URL”. Gdy jednostką są bajty, możesz też wyłączyć „Dopełnienie”, jeśli system docelowy nie oczekuje znaków =.
  4. Kliknij „Generuj”, aby uzyskać nowe wartości, a następnie „Kopiuj wszystko” lub „Pobierz”, aby zapisać listę.

Bajty, znaki i entropia

Siłę losowego ciągu mierzy się w bitach entropii. Każdy losowy bajt dodaje 8 bitów, więc 16 bajtów daje 128 bitów, a 32 bajty – 256 bitów. Base64 zmienia jedynie sposób zapisu tych bajtów: każdy znak niesie 6 bitów, a każde 3 bajty zamieniają się w 4 znaki. Narzędzie pokazuje entropię każdego ciągu, więc można ją sprawdzić jednym rzutem oka.

Gdy jednostką są bajty losowych danych, wynik dekoduje się dokładnie do ustawionej liczby losowych bajtów – właśnie tego potrzebują klucze i sekrety. Gdy jednostką są znaki, otrzymujesz dokładnie tyle znaków, ile ustawiono, a każdy z nich jest wybierany z równym prawdopodobieństwem spośród 64 znaków alfabetu; ta jednostka przydaje się, gdy system wymaga tokena o stałej długości i przechowuje go jako tekst.

BajtyZnaki Base64EntropiaTypowe zastosowanie
121696 bitówNonce (IV) dla AES-GCM
1624 (22 bez dopełnienia)128 bitówSole, tokeny sesji i CSRF, klucze AES-128
3244 (43 bez dopełnienia)256 bitówKlucze AES-256 i HMAC-SHA256, sekrety HS256, klucze API
6488 (86 bez dopełnienia)512 bitówKlucze HMAC-SHA512, sekrety HS512

Gdzie używa się losowych wartości Base64

  • Sekrety JWT. RFC 7518 wymaga klucza HMAC co najmniej tak długiego jak wynik funkcji hashującej: 32 bajty dla HS256, 48 dla HS384 i 64 dla HS512. Niektóre biblioteki używają ciągu sekretu bezpośrednio, inne najpierw dekodują go z Base64, więc sprawdź, czego oczekuje używana biblioteka. Dekoder JWT weryfikuje podpisy od HS256 do HS512 z sekretem w każdej z tych postaci, a generator HMAC przyjmuje klucz jako tekst, hex lub Base64.
  • Klucze aplikacji. Laravel przechowuje na przykład 32-bajtowy klucz szyfrowania w pliku .env jako APP_KEY=base64:..., czyli w tej samej postaci co 32-bajtowy ciąg z tego narzędzia.
  • Obiekty Secret w Kubernetes. Wartości w polu data muszą być zapisane w standardowym Base64 z dopełnieniem. Ciąg wygenerowany w jednostce bajtów, w wariancie „Standardowy” i z włączonym dopełnieniem można tam wpisać bezpośrednio, a Pod otrzyma surowe losowe bajty. Jeśli aplikacja oczekuje samego tekstu Base64, umieść go zamiast tego w polu stringData.
  • Tokeny w adresach URL. Linki do resetowania hasła, kody zaproszeń i inne tokeny przesyłane w adresach URL powinny używać wariantu bezpiecznego dla URL, który zastępuje + i / znakami - i _. Szczegóły znajdziesz na stronie Base64URL.

Dlaczego crypto.getRandomValues, a nie Math.random

Math.random() to szybki generator ogólnego przeznaczenia. Jego wyniki nie są projektowane tak, by były nieprzewidywalne, a w niektórych silnikach stan wewnętrzny da się odtworzyć na podstawie kilku wartości. To narzędzie korzysta z crypto.getRandomValues() – kryptograficznie bezpiecznego generatora inicjowanego przez system operacyjny, czyli z tego samego rodzaju źródła, na którym opierają się openssl rand i moduł secrets w Pythonie. Wartości powstają na urządzeniu i nigdy nie są wysyłane ani zapisywane.

Generowanie losowego Base64 w kodzie

# Powłoka: 32 losowe bajty jako Base64 (44 znaki)
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)        # bezpieczny dla URL, bez dopełnienia, 43 znaki

// Node.js
const crypto = require('crypto');
crypto.randomBytes(32).toString('base64');
crypto.randomBytes(32).toString('base64url');   // bezpieczny dla URL, bez dopełnienia

// Przeglądarka
const bytes = crypto.getRandomValues(new Uint8Array(32));
btoa(String.fromCharCode(...bytes));

Najczęściej zadawane pytania

Jak długi powinien być losowy klucz lub sekret?

16 bajtów (128 bitów) wystarczy dla wartości, które mają być jedynie unikatowe i niemożliwe do odgadnięcia, takich jak identyfikatory sesji, tokeny CSRF i sole. Dla kluczy AES-256, kluczy HMAC-SHA256 i sekretów HS256 używaj 32 bajtów (256 bitów), a dla HMAC-SHA512 i HS512 – 64 bajtów.

Czy to to samo co openssl rand -base64 32?
Narzędzie tworzy wartości tego samego rodzaju. Przy długości 32 bajtów, wariancie „Standardowy” i włączonym dopełnieniu każdy wynik ma 44 znaki, kończy się jednym = i dekoduje się do 32 losowych bajtów. Same wartości są oczywiście za każdym razem inne.
Którą jednostkę wybrać: bajty czy znaki?

Bajtów używaj wtedy, gdy ciąg będzie dekodowany, np. w przypadku kluczy szyfrowania i obiektów Secret w Kubernetes. Znaków używaj, gdy system potrzebuje tokena o dokładnie określonej długości i używa tekstu w niezmienionej postaci. Ciąg wygenerowany w jednostce znaków na pewno zdekoduje się poprawnie tylko wtedy, gdy jego długość jest wielokrotnością 4.

Kiedy potrzebny jest wariant bezpieczny dla URL?
Zawsze, gdy wartość trafia do adresu URL, ciągu zapytania, pliku cookie lub nazwy pliku. W standardowym Base64 znak / dzieli ścieżki URL, a + zamienia się w spację w ciągach zapytania zakodowanych jak dane formularza. Base64 bezpieczny dla URL używa zamiast nich - i _ i zwykle zapisuje się go bez dopełnienia.
Czy wygenerowane wartości są gdzieś zapisywane lub wysyłane?

Nie. Generuje je JavaScript w przeglądarce; nie są nigdzie przesyłane i znikają po opuszczeniu strony. Gdy użyjesz którejś z nich jako prawdziwego sekretu, przechowuj ją w menedżerze haseł lub magazynie sekretów, a nie w wiadomościach na czacie czy w zgłoszeniach.