Как создать случайную строку?

Я хотел бы создать случайную строку (например, пароли, имена пользователей и т. д.). Должна быть предусмотрена возможность указать необходимую длину (например, 13 символов).

Какие инструменты я могу использовать?

(Для соображений безопасности и конфиденциальности предпочтительнее, чтобы строки генерировались в автономном режиме, а не в Интернете на веб-сайте.)

120 голосов | спросил landroni 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 19 Sep 2015 11:06:20 +0300 2015, 11:06:20

16 ответов


112

Чтобы создать случайный пароль, вы можете использовать pwgen :

  

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

Сгенерируйте 7 паролей длиной 13:

[email protected]:~$ pwgen 13 7
Eu7Teadiphaec giepahl3Oyaiy iecoo9Aetaib4 phaiChae6Eivi athoo3igee8Co
Iphu4ufeDeelo aesoYi2lie9he 

Как указано в комментариях, вы можете избежать уменьшения энтропии с помощью аргумента -s (т. е. создать более безопасные, полностью случайные, но трудно запоминающиеся пароли):

[email protected]:~$ pwgen -s 13 7
eAfycrPlM4cYv 4MRXmZmyIVNBp D8y71iqjG7Zq7 FQRHcserl4R8O yRCUtPtV3dsqV
0vJpp2h0OrgF1 QTp7MKtJyTrjz 

Для генерации случайных имен пользователей вы можете использовать gpw :

  

Этот пакет генерирует объявляемые пароли. Он использует статистику   трехбуквенные комбинации (триграфы), взятые из любых словарей, которые вы   кормите его.

Сгенерируйте 7 паролей (имена пользователей) длиной 13:

[email protected]:~$ gpw 7 13
sreepoidahsas
risadiestinge
ntodynesssine
deodstestress
natinglumperm
riasigentspir
enderiferback
ответил landroni 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 19 Sep 2015 11:11:19 +0300 2015, 11:11:19
105

Мой любимый способ сделать это - с помощью /dev/urandom вместе с tr удалить ненужные символы. Например, чтобы получить только цифры и буквы:

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''

В качестве альтернативы, включает больше символов из Список специальных символов пароля OWASP :

</dev/urandom tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>[email protected][\]^_`{|}~' | head -c 13  ; echo

Если у вас есть проблемы с tr, жалующимися на ввод, попробуйте добавить LC_ALL=C следующим образом:

LC_ALL=C tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>[email protected][\]^_`{|}~' </dev/urandom | head -c 13 ; echo
ответил herbert 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 19 Sep 2015 11:18:41 +0300 2015, 11:18:41
61

Я использую команду openssl, швейцарский армейский нож криптографии.

openssl rand -base64 12

или

openssl rand -hex 12
ответил 400 the Cat 27 PM00000080000003431 2016, 20:22:34
11

Вот как я это делаю. Он генерирует случайную строку из 10 символов. Вы можете оптимизировать его, заменив «сгиб», другими инструментами обработки строк.

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
ответил x1b2j 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 20 Sep 2015 03:16:39 +0300 2015, 03:16:39
7

В зависимости от уровня случайности, который вы хотите, вы можете просто пойти с bash (также zsh и ksh, возможно, другие) builtin $RANDOM variable:

$ echo $RANDOM | tr '[0-9]' '[a-zA-Z]'
bfeci
$ echo $RANDOM | tr '[0-9]' '[a-zA-Z]'
cijjj

Методы, непосредственно прочитанные из /dev/urandom, намного проще, но для завершения вы также можете использовать $RANDOM:

echo $(for((i=1;i<=13;i++)); do printf '%s' "${RANDOM:0:1}"; done) | tr '[0-9]' '[a-zA-Z]'
ответил terdon 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 19 Sep 2015 16:08:08 +0300 2015, 16:08:08
7

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

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

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

ответил drws 28 AMpFri, 28 Apr 2017 01:24:40 +030024Friday 2017, 01:24:40
5

@Brandin объяснил в комментарии к другому ответу, как получить не более 100 байт из /dev/urandom, используя head -c 100. Другой способ сделать это - dd:

tr -dc A-Za-z0-9 < /dev/urandom | dd bs=100 count=1 2>/dev/null

2>/dev/null в конце команды dd состоит в том, чтобы подавить вывод «... records in /... records out».

Я не знаю каких-либо существенных преимуществ /недостатков между этими двумя методами.

У меня возникла проблема с обоими методами tr, жалующимися на ввод. Я думал, что это было потому, что ему не нравилось получать двоичный вход, и поэтому предлагал сначала фильтровать /dev/random с помощью iconv -c -t US. Однако Жиль предложил другой диагноз и решение, которое работает для меня:

LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2>/dev/null
ответил dubiousjim 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 19 Sep 2015 12:18:26 +0300 2015, 12:18:26
3

Вы можете использовать один из инструментов md5, который имеет именно эту цель. В случае создания полностью случайного пароля вы можете использовать md5pass. Это очень простой инструмент для использования и очень полезно, так как вы можете использовать «обычный текст» вместе с «солью» для построения бит-бит с тем же паролем, который впоследствии можно восстановить, или, альтернативно, вы можете получить полностью случайный пароль все время. Общее использование:

md5pass [password] [salt]

где password - это выбранное слово, которое будет использоваться для построения случайной строки, а salt - это прыжок в байтах, который будет использоваться. Вот так:

md5pass word

$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0

Это создаст вам пароль «случайной последовательности». Если вы не используете salt, то впоследствии вы не сможете воссоздать эту же строку.

Однако, если вы используете salt, как это:

md5pass word 512

$1$512$.0jcLPQ83jgszaPT8xzds0

, то вы можете создать последовательность, которую вы можете восстановить, если вы используете это слово в сочетании с той же солью (или прыжком), если она была первоначально определена.

ответил Paulo Maia 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 22:24:47 +0300 2015, 22:24:47
1

Эти две команды генерируют случайные пароли и кодовые фразы соответственно.

shuf --random-source=/dev/urandom --repeat --head-count=20 file_with_characters | tr --delete '\n'

shuf --random-source=/dev/urandom --repeat --head-count=7 file_with_words | tr '\n' ' '

Генератору паролей требуется имя_файла file_with_characters, содержащего все символы, которые вы хотите использовать пароль, по одному символу в строке и ровно один раз каждый. Файл не должен содержать пустые строки, а строки должны быть завершены в новой строке.

Генератору парольной фразы требуется файл_with_words, содержащий все слова, которые вы хотите использовать фразу для паролей, по одному слову на строку и ровно один раз каждый. Файл не должен содержать пустые строки, а строки должны быть завершены в новой строке.

Параметр -head-count указывает длину пароля - в символах - или парольной фразе - словами.

ответил Pablo Repetto 27 PM00000070000001331 2016, 19:47:13
1

APG - это программное обеспечение по умолчанию в дистрибутивах Linux.

Чтобы сгенерировать пароли размером от 5 до 10 в подмножествах Special, Numeric, Capital un Small, это:

apg -MSNCL -m 5 -x 10

Возвращает

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

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

ответил Sandburg 22 Jpm1000000pmSun, 22 Jan 2017 18:24:03 +030017 2017, 18:24:03
0

Супер простой и простой (возможно, более простой, чем вы ищите) способ добиться этого, будет генерировать случайное число в заданном диапазоне, преобразовать это число в эквивалентный символ ASCII и добавить его в конец строки.

Вот базовый пример в Python:

 import random # import random library  
passFile = open("passwords.txt", 'w') # create file passwords.txt
passNum = int(input("Number of passwords: ")) # get number of  passwords
passLength = int(input("Password length: ")) # get length of passwords  
for i in range(passNum):
    password = "" # reset password
    for i in range(passLength):
        num = random.randint(65, 122) # get random number
        while num in range(91, 97): # Don't include punctuation
            num = random.randint(65, 122)
        password += chr(num) # add character to current password 
    passFile.write(password + "\n") # add current password to file  
passFile.close() # close file

EDIT: добавлены комментарии и добавлен код для генерации нескольких паролей и записи их в файл

ответил camelCaseEnthusiast 20 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 20 Sep 2015 03:09:29 +0300 2015, 03:09:29
0

Вдохновленный Pablo Repetto, я получил это легко запоминающееся решение :

shuf -zer -n20  {A..Z} {a..z} {0..9}

-z избегает многострочного выхода

-e повторить результат

-r позволяет любому символу появляться несколько раз

-n20 случайная строка длиной 20 символов

{A..Z} {a..z} {0..9} разрешенные классы char

shuf является частью linux coreutils и широко доступен или, по крайней мере, был перенесен.

ответил entwicklerseite 30 +03002016-10-30T01:06:20+03:00312016bEurope/MoscowSun, 30 Oct 2016 01:06:20 +0300 2016, 01:06:20
0

Я поддерживаю secpwgen в Alpine Linux и amp; сохраните источники на моем 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.

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

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.
ответил Stuart Cardall 7 AMpFri, 07 Apr 2017 06:14:39 +030014Friday 2017, 06:14:39
0

Я обнаружил, что piping /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
ответил Jake 19 J000000Thursday18 2018, 00:59:42
-1

Мне нужна эта команда:

date +%s | sha256sum | base64 | head -c 12
ответил Eugen Konkov 19 62016vEurope/Moscow11bEurope/MoscowSat, 19 Nov 2016 13:13:34 +0300 2016, 13:13:34
-3

Я иду, чтобы http://passwordsgenerator.net/ он позволяет создавать строки случайных символов длиной до 2048 символов, выбирать верхний регистр, строчный регистр, цифры от 0 до 9, знаки препинания или любую комбинацию.

ответил KrazyKyngeKorny 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 22:05:01 +0300 2015, 22:05:01

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132