Chciałbym wygenerować losowy ciąg (np. Hasła, nazwy użytkowników itp.). Powinno być możliwe określenie wymaganej długości (np. 13 znaków).
Z jakich narzędzi mogę korzystać?
(Ze względów bezpieczeństwa i prywatności lepiej jest, aby ciągi były generowane w trybie offline, w przeciwieństwie do online na stronie internetowej.)
apg
osobiście.)apg
do wygenerowania losowego ciągu./dev/urandom
.). Byłoby miło mieć jakieś odpowiedzi przy użyciu prawdziwych generatorów liczb losowych, opartych np . Na random.org .Odpowiedzi:
Moim ulubionym sposobem na to jest użycie
/dev/urandom
razem z,tr
aby usunąć niechciane postacie. Na przykład, aby uzyskać tylko cyfry i litery:Alternatywnie, aby dołączyć więcej znaków z listy znaków specjalnych hasła OWASP :
Jeśli masz problemy z
tr
narzekaniem na dane wejściowe, spróbuj dodać wLC_ALL=C
ten sposób:źródło
head /dev/urandom | tr -dc A-Za-z0-9 | head -c10
- Ten sposób jest dokładniejszy. Otrzymujesz 10 znaków, które są wielkimi, małymi lub cyframihead
polecenie może być problematyczne. Wyprowadzi pierwsze 10 wierszy/dev/urandom
, co oznacza, że zatrzyma się, gdy zobaczy 10-ty nowy wiersz. Zatem długość danych wyjściowych wysyłanych dotr
polecenia jest losowa. Możliwe, że na wyjściu będzie mniej niż 13 znakówtr
. Nie obliczyłem prawdopodobieństwa takiego zdarzenia, obliczenia są nieco trudne.<dev/urandom tr -dc "$charset" | head -c "$length"
tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
tr ..
poleceniem, ale po prostu cytuje wszystko (z wyjątkiem pojedynczego cudzysłowu) -tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'
.Aby wygenerować losowe hasło, możesz użyć
pwgen
:Wygeneruj 7 haseł o długości 13:
Jak wspomniano w komentarzach, można uniknąć zmniejszenia entropii za pomocą
-s
argumentu (tj. Wygenerować bezpieczniejsze, całkowicie losowe, ale trudne do zapamiętania hasła):Aby wygenerować losowe nazwy użytkowników, możesz użyć
gpw
:Wygeneruj 7 haseł (nazw użytkowników) o długości 13:
źródło
pwgen -s
.Korzystam z
openssl
polecenia, szwajcarskiego wojskowego noża do kryptografii.lub
źródło
rand -hex
ograniczy wyjście do zaledwie 16 znaków, zamiast 90+ na mojej klawiaturze. base64 jest lepszy, ponieważ ma 64 znaki, ale nie jest losowy (np. istnieją przewidywalne wzorce wypełnienia i być może niektóre znaki pojawiają się częściej niż inne).openssl rand -base64 12
daje 16 znaków wyjściowych (ponieważ 256 wartości jest odwzorowanych na 64). Przykład heksadecymalny daje 24 znaki. W przypadku heksa nie ma strat, ponieważ jest to proste odwzorowanie 1: 2, ale może być trochę w przypadku base64, ponieważ używane jest padding. Podstawa nie wpływa na losowość, to sposób, w jaki jeden jest mapowany na inny, który działa. (a całkowita liczba bitów jest znacznie ważniejsza).Oto jak to robię. Generuje losowy ciąg 10 znaków. Możesz go zoptymalizować, zastępując „fold” innymi narzędziami do przetwarzania łańcucha.
źródło
/dev/urandom
oczywiście użycieAby wygenerować hasło z najwyższą możliwą entropią przy użyciu standardowych narzędzi Linux, które są wbudowane w każdą dystrybucję, której używam:
Powoduje to wyświetlenie wszystkich znaków drukowalnych ASCII - od 32 (spacja) do 126 (tylda,
~
). Długość hasła może być sterowane zhead
„s-c
flagi. Istnieją również inne możliwe zestawy znakówtr
(aby nie uwzględniać spacji, wystarczy użyć znaków 33-126[:graph:]
).źródło
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echo
jeśli nie chcesz` characters in generated string.
`ponieważ jest to znak ucieczki w wielu językach powoduje problemy< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echo
wykluczyć | \ / `i spacjaW zależności od pożądanego poziomu losowości, możesz po prostu użyć wbudowanej zmiennej bash (również
zsh
iksh
ewentualnie innych)$RANDOM
:Metody czytania bezpośrednio z
/dev/urandom
są znacznie prostsze, ale dla uzupełnienia możesz również użyć$RANDOM
:Ważne : to rozwiązanie będzie generować losowe ciągi przy użyciu pierwszych 10 liter alfabetu. To, czy to ci wystarczy, zależy od tego, czego potrzebujesz.
źródło
$RANDOM
wypisze liczbę od 0 do 32767.rand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)
.Zainspirowany przez Pablo Repetto otrzymałem to łatwe do zapamiętania rozwiązanie:
-z pozwala uniknąć wyjścia wieloliniowego
-e echo wyniku
-r pozwól, aby dowolna postać pojawiła się wiele razy
-n20 losowy ciąg o długości 20 znaków
{A..Z} {a..z} {0..9} dozwolone klasy znaków
shuf
jest częścią systemu Linux i jest szeroko dostępny lub przynajmniej przeniesiony.źródło
@Brandin wyjaśnił w komentarzu do innej odpowiedzi, w jaki sposób uzyskać maksymalnie 100 bajtów z
/dev/urandom
użyciahead -c 100
. Innym sposobem na to jestdd
:Na
2>/dev/null
końcudd
polecenia jest pomijanie wyjścia „... rekordy w / ... rekordy poza”.Nie znam żadnych istotnych zalet / wad tych dwóch metod.
Miałem problem z obiema metodami
tr
narzekania na dane wejściowe. Myślałem, że to dlatego, że nie podoba otrzymaniu wejście binarne, a więc sugeruje pierwszy filtrowanie/dev/random
ziconv -c -t US
. Jednak Gilles zaproponował inną diagnozę i rozwiązanie, które działa dla mnie:źródło
iconv
rozwiązanie maksymalizuje jeden rdzeń procesora i nie daje wyniku (czekałem jakieś 10libc-bin
2.19. Nie jestem pewien, czy to ta samatr
obsługuje dane binarne. Jednak na ustawienia takieA-Z
mogą mieć wpływ ustawienia regionalne. SpróbujLC_ALL=C tr …
tr
Robi to tylko GNU , ponieważ w ogóle nie obsługuje wielobajtowych (np. Kiedy ostatnio sprawdzałem, zmiana wielkości liter została zaimplementowana poprzez ustawienie szóstego bitu każdego bajtu). Inne systemy (np. BSD) obsługują wielobajtowe i to tam zawiedzie, ponieważ szansa, że losowy strumień wejściowy jest również prawidłowym strumieniem wielobajtowym, jest bardzo mała w większości kodowań. GNU może dodać obsługę wielobajtową w dowolnym momencie, w którym to momencie się nie powiedzie. Oczywiście ustawienieLC_ALL=C
to naprawi.tr
przetwarzania danych binarnych (w ustawieniach regionalnych C). (No cóż, ok, wyraźnie mówi tylko, że mają być obsługiwane bajty zerowe, nie oznacza, że obsługiwane są niepuste pliki nie kończące się znakiem nowego wiersza, ale w praktyce tak też jest zawsze.)APG
jest domyślnie dołączany do niektórych dystrybucji Linuksa.Aby wygenerować hasła od rozmiaru 5 do 10 w podzestawach Specjalne, Numeryczne, Wielkie i Niższe, polecenie to:
I wraca
Jak powiedział w komentarzu @landroni.
źródło
apg -a1 -m14
Możesz użyć jednego z
md5
narzędzi, które mają właśnie ten cel. W przypadku utworzenia całkowicie losowego hasła możesz użyćmd5pass
. Jest to bardzo proste narzędzie w użyciu i bardzo pomocne, ponieważ można użyć „normalnego tekstu” wraz z „solą”, aby przeskoczyć konstrukcję tego samego hasła, które można odzyskać później, lub alternatywnie możesz chcieć uzyskać całkowicie losowe hasło przez cały czas. Ogólne zastosowanie to:gdzie
password
jest wybranym słowem, które zostanie użyte do budowy losowego łańcucha, isalt
jest używany skok w bajtach. Lubię to:Spowoduje to utworzenie hasła „losowej sekwencji” do użycia. Jeśli użyjesz „nie”
salt
, możesz później nie być w stanie odtworzyć tego samego ciągu.Jeśli jednak użyjesz
salt
takiego:następnie możesz utworzyć sekwencję, którą możesz odzyskać, jeśli użyjesz tego słowa w połączeniu z tą samą solą (lub skokiem), jeśli zostało pierwotnie zdefiniowane.
źródło
salt
używa się a, brzmi to podobnie do podejścia PasswordMaker ...Użyj
xxd
polecenia, aby określić długość (przez -l), która działa zarówno w systemie Linux, jak i OS. https://www.howtoforge.com/linux-xxd-command/źródło
Te dwa polecenia generują odpowiednio losowe hasła i hasła.
Generator haseł wymaga pliku_z_znakami, zawierającego wszystkie znaki, których hasło ma używać, jeden znak w wierszu i dokładnie jeden raz każdy. Plik nie może zawierać pustych linii, a linie muszą być zakończone znakiem nowej linii.
Generator hasła wymaga pliku file_with_words zawierającego wszystkie słowa, których chcesz użyć, jedno słowo w wierszu i dokładnie za każdym razem. Plik nie może zawierać pustych linii, a linie muszą być zakończone znakiem nowej linii.
Opcja --head-count określa długość hasła - w postaci znaków - lub hasła - w słowach.
źródło
Przekonałem się, że pipowanie / dev / urandom do tr na macOS nie działa. Oto inny sposób:
źródło
Używam:
base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44
To daje mi 57 możliwych znaków. Ciąg może zostać wklejony (usunięty
+
i\
) lub wydrukowany i ponownie wpisany, ponieważ trudne do odróżnienia znaki (I1lO0
) zostały usunięte.Lubię to, ponieważ:
Podziękowania dla https://unix.stackexchange.com/a/230676/9583, a zwłaszcza komentarze do mojej początkowej inspiracji.
źródło
1
bez zmniejszania entropii (podczas generowania nowego, aby uzyskać jeden w / numer , zmniejsza entropię). Możesz także bezpiecznie dołączyć!
bez zmniejszania entropii. Żaden schemat nie zwiększa też wartości entropii, ale może doprowadzić wygenerowany ciąg znaków do zgodności ze starszymi wymaganiami dotyczącymi hasła.Filozofia uniksowa dotycząca „wielu małych narzędzi, które dobrze wykonują jedną rzecz” służy ci w tym przypadku bardzo dobrze.
/dev/urandom
jest strumieniem losowych „bajtów” (które zawierają znaki niedrukowalne)base64
koduje dane bajtowe[A-Za-z0-9/+]
(które można w całości wydrukować)dd
kopiuje dane wejściowe na wyjście, stosując modyfikatory podane jako argumenty (które mogą obejmować rozmiar bloku i liczbę bloków)OSX
Linux
Uwagi:
tr -d '[A-Z/+]'
pozbyć się wielkich liter+
i/
bs
(rozmiar bloku) na dowolną potrzebną długość.base64
jest domyślnie zawijany do 76 kolumn i należy go zresetować,-w0
chyba że tego chcesz.źródło
Chciałbym przekazać moje zwykłe polecenie, aby wygenerować hasło
Aby skonfigurować długość hasła, zmień liczbę w poleceniu cięcia na wymaganą długość, na przykład 24 znaki
Nie chcesz mylić 0 lub O, 1 lub l? Odfiltruj to z innym
tr
Osobiście nigdy nie wolę specjalnego znaku w haśle, dlatego wybieram tylko
[:alnum:]
generator hasełźródło
Utrzymuję
secpwgen
w Alpine Linux i przechowuję źródła na moim Githubie .Może generować losowe ciągi lub frazy diceware:
Aby wygenerować losowy ciąg 13 znaków, użyłbyś:
Aby użytkownicy pamiętali hasło, użyj wyrażeń diceware:
Osobiście lubię:
źródło
Mój sposób na bardzo bezpieczne hasło (gdzie 16 to długość pw):
Przykładowy wynik:
Lub alternatywnie, aby wygenerować wiele haseł:
cat / dev / urandom | tr -cd [: graph:] | fold -w 16 | head -6
Przykładowy wynik:
Trochę mniej bezpieczny (mniejszy zestaw znaków):
Przykładowy wynik:
źródło
Bardzo łatwym i prostym (prawdopodobnie prostszym niż szukasz) sposobem na osiągnięcie tego byłoby wygenerowanie losowej liczby w danym zakresie, przekonwertowanie tej liczby na równoważny znak ASCII i dołączenie jej na końcu łańcucha .
Oto podstawowy przykład w Pythonie:
EDYCJA: dodano komentarze i kod, aby wygenerować wiele haseł i zapisać je w pliku
źródło
Chciałbym to polecenie:
źródło
date +%N
ponieważ jeśli wygenerujesz wielu użytkowników i hasła w skrypcie, sekundy mogą stać się takie same dla wielu lub nawet wszystkich poleceń daty, tworząc w ten sposób identyczne hasła.dd if=/dev/random bs=512 count=1
?Przechodzę do strony http://passwordsgenerator.net/, która umożliwia generowanie ciągów losowych znaków do 2048 znaków, wybieranie wielkich liter, małych liter, cyfr od 0 do 9, znaków interpunkcyjnych lub dowolnej kombinacji.
źródło