Как сгенерировать случайную строку?

Нет, нет возможности получить структуру файловой системы.

Программа восстановления получает файлы с низкого уровня жесткого диска, где данные не имеют такой структуры, как обычная структура, которую мы видим в проводнике файлов.

227
26.09.2015, 10:05
14 ответов

Чтобы сгенерировать пароль с максимально возможной энтропией с помощью стандартных инструментов Linux, встроенных в каждый используемый мной дистрибутив:

< /dev/urandom tr -cd "[:print:]" | head -c 32; echo

Это выводит все печатные символы ASCII - от 32 (пробел) до 126. (тильда, ~). Длиной пароля можно управлять с помощью флага -c head. Существуют также другие возможные наборы символов в tr (чтобы не включать пробел, только символы 33-126, используйте [:graph:]).

21
27.01.2020, 19:28

Я бы хотел эту команду:

date +%s | sha256sum | base64 | head -c 12
-2
27.01.2020, 19:28

APG включен по умолчанию в некоторые дистрибутивы Linux.

Чтобы сгенерировать пароли размером от 5 до 10 в подмножествах Special, Numeric, Capital и Lower, команда следующая:

apg -MSNCL -m 5 -x 10

И возвращает

@OpVeyhym9
3:Glul
3DroomIc?
hed&Os0
NefIj%Ob3
35Quok}

Как сказано в комментарии @landroni.

9
27.01.2020, 19:28

Я поддерживаю secpwgen в Alpine Linux и храню источники на моем Github.

Он может создавать случайные строки или фразы для игральных костей:

musl64 [~]$ secpwgen
USAGE: secpwgen <-p[e] | -A[adhsy] | -r | -s[e]> N

PASSPHRASE of N words from Diceware dictionary
  -p    generate passphrase
  -pe   generate enhanced (with symbols) passphrase

SKEY PASSWORD of N words from S/Key dictionary
  -s    generate passphrase
  -se   generate enhanced (with symbols) passphrase

ASCII RANDOM of N elements (at least one option MUST be present)
  -A    Each letter adds the following random elements in output:
    a    alphanumeric characters
    d    decimal digits
    h    hexadecimal digits
    s    special characters
    y    3-4 letter syllables

RAW RANDOM
  -r    output BASE64 encoded string of N random BITS
  -k    output koremutake encoding of N random BITS

Чтобы сгенерировать 13-символьную случайную строку, которую вы бы использовали:

musl64 [~]$ secpwgen -Aas 13
----------------
WK5#*V<]M3<CU ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

musl64 [~]$ secpwgen -Aa 13
----------------
GP0FIEBM9Y3BT ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

Для пользователей, чтобы запомнить пароль, используйте фразы из diceware:

musl64 [~]$ secpwgen -p 5
----------------
wq seen list n8 kerr  ;ENTROPY=65.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.

Мне лично нравится:

musl64 [~]$ secpwgen -r 512
----------------
h62lL7G4gwh3/j9c7YteQvVXoqJrQKKPWVR3Lt7az36DcfWZWtUgBT19iwmJBwP4UahNzPe7qYD7OcklUFpCzQ== ;ENTROPY=512.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.
1
27.01.2020, 19:28

Я использую:

base64 < /dev/urandom | tr -d 'O0Il1+/' | head -c 44; printf '\n'

Это дает мне 57 возможных символов. Строка может быть скопирована -, вставлена ​​(, удалена +и ``)или распечатана и перепечатана, так как трудно различимые символы(I1lO0)были удалены.

  • 44 символа дают мне :log 2(57 44)> 256,64 бит энтропии
  • 22 символа дают мне :log 2(57 22)> 128,32 бит энтропии

Мне это нравится, потому что:

  • команда легко набирается и запоминается
  • используются стандартные системные инструменты -нет дополнительных бинарных файлов
  • не «тратит впустую» много случайности (использует 89% случайных битов, которые он получает, по сравнению с ~24% для решений, напрямую передающих tr)
  • 22 и 44 символа довольно хорошо сочетаются между собой (чуть выше даже )общей мощности двух точек останова
  • выходные данные могут быть легко выбраны и вставлены или распечатаны и перепечатаны с минимальной частотой человеческих ошибок
  • короче, чем в шестнадцатеричном кодировании (32 и 64 вместо 22 и 44 )решения, такие как md5sum/sha1sum и т. д.

Кредитhttps://unix.stackexchange.com/a/230676/9583и особенно комментарии для моего первоначального вдохновения.

6
27.01.2020, 19:28

Я хотел бы внести свою обычную команду для создания пароля

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -13
b0R55751vWW9V

Чтобы настроить длину пароля, измените число в команде вырезания на требуемую длину, например, 24 символа

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -24
WFBhVHuKbrnRhd5kdWXPzmZG

Не хотите путать 0 или O, 1 или l? Отфильтруйте это другимtr

$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' | tr -d '0O1l'|cut -c -24
JuCphwvhrhppD9wVqfpP2beG

Лично я никогда не предпочитаю специальные символы в паролях, поэтому я выбираю только [:alnum:]для своего генератора паролей

4
27.01.2020, 19:28

Философия Unix «множество небольших инструментов, которые хорошо справляются с одной задачей» очень хорошо вам подходит в этом случае.

  • /dev/urandomпредставляет собой поток случайных «байтов» (, которые включают непечатаемые -символы)
  • base64кодирует байтовые данные в [A-Za-z0-9/+](, который полностью доступен для печати)
  • ddкопирует ввод в вывод, применяя модификаторы, заданные в качестве аргументов (, которые могут включать размер блока и количество блоков)

OS X

base64     < /dev/urandom | dd bs=1k count=1

Линукс

base64 -w0 < /dev/urandom | dd bs=1k count=1

Примечания:

  • Если вам нужно подмножество символов, вы можете вставить модификатор в канал.
    • Пример :tr -d '[A-Z/+]', чтобы избавиться от заглавных букв и +и/
  • Вы можете установитьbs(размер блока )любой необходимой длины.
  • В Linux base64по умолчанию переносится на 76 столбцов и должен быть сброшен с помощью -w0, если вы этого не хотите.
2
27.01.2020, 19:28

Я обнаружил, что передача /dev/urandom в tr в macOS не работает. Вот еще один способ:

set="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
n=6
rand=""
for i in `seq 1 $n`; do
    char=${set:$RANDOM % ${#set}:1}
    rand+=$char
done
echo $rand
5
27.01.2020, 19:28

Мой путь к очень надежному паролю (, где 16 — длина pw):

cat /dev/urandom | tr -cd [:graph:]|head -c 16

Пример результата:

jT@s_Nx]gH<wL~W}

Или, альтернативно, для создания нескольких паролей:

кошка /dev/urandom | tr -cd [ :graph :]|fold -w 16|head -6

Пример результата:

7ck%G7'|f&}_8(]s
<?*]E.CG[NB'gK#A
:tF-WPTOa3!i7S(h
2xy(>=%3=Kb1B$`6
*98Lf{d?Jzb}6q1\
E7uCEAN2Hz]]y|5*

Немного менее безопасный (меньший набор символов):

cat /dev/urandom |base64 -w 0|fold -w 16|head -6

Пример результата:

rJqYxYZLOTV+A45w
PUKQ+BoBf6yfZw5m
+LRfpsN9CsLRiN8V
yMS6zDpL6NHmG17s
yTUWPG7Rum97schi
cognvjVwaKaAyPRK
1
27.01.2020, 19:28

Используйте команду xxd, чтобы указать длину (через -l ), которая работает как в Linux, так и в ОС.https://www.howtoforge.com/linux-xxd-command/

xxd -l16 -ps /dev/urandom
13
27.01.2020, 19:28

Пока ни один из ответов не соответствует -OS.

Основные недостатки представлены определением локали (случай MacOS )и trнеспособность распознавать интервалы символов (случай Solaris ).

Попробуйте шлибы . Это свежая и по-настоящему кросс -ОС. Код для получения случайной строки — shlibs str005(./shlibs str005).

Получить случайную строку из 50 символов, включая знаки препинания, исключая числа:

shlibs str005 50 -p -xd
0
07.03.2020, 12:10

pwgen, как и все остальные, для паролей.

Только строчные буквы, безопасный, не менее 1 цифры, 8 символов, 1 результат

$ pwgen -snA 8 1
d14o5wgh

То же, но как минимум 1 заглавная буква

$ pwgen -csn 8 1
bMxDxcr4

Командный интерфейс Diceware для имен пользователей и паролей, если хотите, для чего-то более удобного для запоминания; Я использую пакет pip diceware, который подходит для моих нужд.

3 слова и 2 символа

$ diceware -n3 -s2
DemandingWhimsical*a1iar

Я уверен, что есть еще по крайней мере 100, из которых 74% написаны на nodejs, потому что, э-э... ну, это то, что они делают. Что бы вы ни выбрали, я бы отдал приоритет встроенному -в верхнем/нижнем регистре, потому что в какой-то момент у вас будут эти ограничения, и выполнение любого из них раздражающе долго в оболочке posix.

ура

2
11.01.2021, 02:28

Для macOS Big Sur необходимо поставить LC_ALL=Cперед tr.

Если вы хотите легко выполнить его как команду из вашей оболочки, поместите следующее в файл.zshrc:

random() {
    cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w ${1:-32} | head -n 1
}

randomnum() {
    cat /dev/urandom | LC_ALL=C tr -dc '0-9' | fold -w ${1:-4} | head -n 1
}

Сохраните и закройте файл.

Откройте новый терминал.

Использование:

$ random
75LW1xKI1PI9qF7ITWVzABEowhSrItcT
$ random 15
lnk0FJhjiMyuSeV
$ randomnum 7
7933094
-2
01.09.2021, 21:07

Для длины от 1 до 32 можно использовать uuidgenиз libuuidили util-linux, просто заменив <LENGTH>ниже:

uuidgen -r | tr -d '-' | head -c <LENGTH>

# or

random=$(uuidgen -r | tr -d '-') && echo "${random:0:<LENGTH>}"

Примечание:6–7 из 128 бит предварительно -определены и зафиксированы.

-1
02.10.2021, 02:18

Теги

Похожие вопросы