Jak używać
- 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.
- W polu „Liczba” podaj, ile ciągów potrzebujesz, i wybierz separator między nimi: „Nowy wiersz”, „Przecinek” lub „Spacja”.
- 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 =.
- 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.
| Bajty | Znaki Base64 | Entropia | Typowe zastosowanie |
|---|---|---|---|
| 12 | 16 | 96 bitów | Nonce (IV) dla AES-GCM |
| 16 | 24 (22 bez dopełnienia) | 128 bitów | Sole, tokeny sesji i CSRF, klucze AES-128 |
| 32 | 44 (43 bez dopełnienia) | 256 bitów | Klucze AES-256 i HMAC-SHA256, sekrety HS256, klucze API |
| 64 | 88 (86 bez dopełnienia) | 512 bitów | Klucze 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
.envjakoAPP_KEY=base64:..., czyli w tej samej postaci co 32-bajtowy ciąg z tego narzędzia. - Obiekty Secret w Kubernetes. Wartości w polu
datamuszą 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 polustringData. - 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?
= 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?
/ 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.