Генерация случайного пароля; почему это не портативно?

Включите extglob опция оболочки и затем cd /home/!(user*)/asdf

21
02.02.2015, 23:21
6 ответов

Это ваша локаль и TR проблема.

В настоящее время GNU TR полностью поддерживает только однобайтовые символы. Таким образом, в локах с использованием многобайтовых кодировков вывод может быть странным:

$ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64
`�pv���Z����c�ox"�O���%�YR��F�>��췔��ovȪ������^,<H ���>

Оболочка будет правильно печатать многобайтовые символы, но GNU TR удалит байты, которые он думает, что не является печати.

Если вы хотите, чтобы это было стабильным, вы должны установить локаль:

$ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64
RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@
34
27.01.2020, 19:43

Другие люди уже указали, что локаль определяет, что [: Печать:] означает. Однако не все печатные символы подходят для паролей (даже в ASCII). Вы действительно не хотите пробелы, вкладки и # $% ^? В вашем пароле - это не просто трудно запомнить, также потенциально опасно для базовой системы аутентификации, может быть невозможно войти в поле ввода и так далее. В этом случае вы должны просто выбирать символы «Sane»:

LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64

или просто

</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64

или даже лучше, используйте base64 , как предложено в других ответах.

3
27.01.2020, 19:43

Как насчет

tr -dc [:print:] < /dev/urandom | head -c 64 | strings

строк следует распечатать вывод увала в формате печати

2
27.01.2020, 19:43

Я не знаю, есть ли какие-либо причина, по которой вы используете / dev / Random для генерации пароля, но я бы порекомендовал вам использовать Pwgen, чтобы облегчить вашу боль.

$ pwgen -s 10 1

Где 10 - длина пароля.

http://man.cx/pwgen

2
27.01.2020, 19:43

Рассмотрим вместо этого

$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7

Это имеет два преимущества:

  • Вы читаете только 48 байт со случайного устройства, а не ~8KB; если другим процессам на том же самом хосте нужны случайные числа, то 8KB дренированные все сразу могут стать серьезной проблемой. (Да, возможно, никто не должен использовать случайное устройство , блокирующее , но люди делают .)

  • Выход base64 практически не содержит символов со специальными значениями. (Совсем ни за что, прикрепите | tr +/ -_ к концу и (как в примере) убедитесь, что количество байтов входа к base64 кратно 3. )

Сгенерированный таким образом пароль имеет ровно 384 бита энтропии, что несколько меньше, чем то, что вы делали (log2 9664 ≈ 421. 4), но более чем достаточно для большинства целей (256 бит энтропии безопасно находится на территории "все еще гадающих, когда Солнце выгорает" , за исключением для ключей RSA, AFAIK).

11
27.01.2020, 19:43
#Chars allowed in password (I don't like l,o,O, etc):
P="0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz"

#Or such:
#P="a-zA-Z0-9"

head -c 8 < /dev/urandom | tr '\000-\377' "$P$P$P$P$P"
echo

Этот метод ИМХО более разумен при использовании данных из /dev/urandom. Строка, вставляемая как $P$P$P..., должна иметь длину не менее 256 символов.

1
27.01.2020, 19:43

Теги

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