Инструменты пользователя

Инструменты сайта


passw_gen

Генерация "хорошего" пароля

В данной заметке я хотел бы рассмотреть несколько вариантов генерации «хорошего»1) пароля.

Генерация средствами sh/bash

На «просторах Интернета» можно найти достаточно много примеров скриптов для генерации пароля. Однако большинство из представленных алгоритмов не могут гарантировать, что будет сгенерирован "криптостойкий" пароль.
Я пользуюсь таким скриптом:

#!/bin/bash
#
 
function randompass () {
        local randompassLength
        if [ $1 ]; then
                randompassLength=$1
        else
                randompassLength=8
        fi
 
        pass=</dev/urandom tr -dc A-Za-z0-9 | head -c $randompassLength
        echo $pass
}
 
fourChrString=`randompass 4`
eightChrString=`randompass`
 
echo "4 character random string : $fourChrString"
echo "8 character random string : $eightChrString"

Ссылка на источник

Программное обеспечение

Для генерации «крипстойких» паролей следует использовать специальное ПО. Выбор подобных программ очень велик посоветовать «универсальное решение» - удобное для всех - весьма непросто. Однако среди десятков приложений я хочу отметить такую программу, как pwgen.
Ссылка на сайт программы Данное ПО доступно всех UNIX-like OS2).

Инсталляция

Установка pwgen зависит от платформы и операционной системы. Проще всего «собрать» pwgen, загрузив «исходные коды» с сайта программы3):

# wget http://downloads.sourceforge.net/project/pwgen/pwgen/2.07/pwgen-2.07.tar.gz
# gunzip pwgen-2.07.tar.gz
# tar xfv pwgen-2.07.tar.gz
# cd pwgen-2.07/
# ./configure
# make install

Результат выполнения configure/make install

Результат выполнения configure/make install

Результат выполнения configure/make install

OS Linux CentOS 7

# ./configure 
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for a BSD-compatible install... /usr/bin/install -c
checking for mv... /bin/mv
checking for rm... /bin/rm
checking for sed... /bin/sed
checking for perl... /usr/bin/perl
checking for getopt_long... yes
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking getopt.h usability... yes
checking getopt.h presence... yes
checking for getopt.h... yes
configure: creating ./config.status
config.status: creating Makefile
#
#
# make install
gcc -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_GETOPT_LONG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETOPT_H=1  -g -O2 -Wall -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align -pedantic   pwgen.c -o pwgen.o
gcc -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_GETOPT_LONG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETOPT_H=1  -g -O2 -Wall -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align -pedantic   pw_phonemes.c -o pw_phonemes.o
gcc -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_GETOPT_LONG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETOPT_H=1  -g -O2 -Wall -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align -pedantic   pw_rand.c -o pw_rand.o
gcc -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_GETOPT_LONG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETOPT_H=1  -g -O2 -Wall -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align -pedantic   randnum.c -o randnum.o
randnum.c: In function ‘pw_random_number’:
randnum.c:50: warning: ‘nbytes’ may be used uninitialized in this function
gcc -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_GETOPT_LONG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETOPT_H=1  -g -O2 -Wall -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align -pedantic   sha1.c -o sha1.o
gcc -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DHAVE_GETOPT_LONG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_GETOPT_H=1  -g -O2 -Wall -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wwrite-strings -Wpointer-arith -Wcast-qual -Wcast-align -pedantic   sha1num.c -o sha1num.o
gcc  -o pwgen pwgen.o pw_phonemes.o pw_rand.o randnum.o sha1.o sha1num.o
mkdir -p /usr/local/bin /usr/local/share/man/man1
/usr/bin/install -c pwgen /usr/local/bin/pwgen
/usr/bin/install -c -m 644 ./pwgen.1 /usr/local/share/man/man1/pwgen.1


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

При запуске pwgen происходит генерация 160 паролей4) каждый из которых имеет длину 8 символов.
Пример (количество строк сокращено):

$ pwgen
Ieb1Ku1r Aich6pau Muje7ayu Nahbie8T Eeshaal3 ooPhie3d ji8ooChu Chaiqu9a
Eingo8ie ahBii8So Choom3ka Saipii0r zaiD5eic Aidai9ai Aa7oKaey osh0MaiT
...

Если же требуется сгенерировать один паролей, но другой длины (15 символов), следует выполнить:

# pwgen -s 15 1
YXzDd1LvoUPjtM5 u9pohgeGIyhVMGZ 6ODDVe4iCe5kPxw

Справка

Список «ключей» при запуске5) (буквы «o» или цифру «0», например); -h - показать справку; -H - путь к файлу с sha1 hash (повышение «криптостойкости»); -C - выводить пароли «по столбцам» - используется по умолчанию; -1 - вывести только один пароль; -v - избегать сочетания гласных чтобы избежать «нецензурных слов» (исключить слово f*ck, например)

pwgen –help

pwgen –help

pwgen –help

Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]
Options supported by pwgen:
  -c or --capitalize
        Include at least one capital letter in the password
  -A or --no-capitalize
        Don't include capital letters in the password
  -n or --numerals
        Include at least one number in the password
  -0 or --no-numerals
        Don't include numbers in the password
  -y or --symbols
        Include at least one special symbol in the password
  -s or --secure
        Generate completely random passwords
  -B or --ambiguous
        Don't include ambiguous characters in the password
  -h or --help
        Print a help message
  -H or --sha1=path/to/file[#seed]
        Use sha1 hash of given file as a (not so) random generator
  -C
        Print the generated passwords in columns
  -1
        Don't print the generated passwords in columns
  -v or --no-vowels
        Do not use any vowels so as to avoid accidental nasty words
1) «криптостойкого»
2) включая «коммерчески» UNIX: IBM AIX®, Oracle Solaris
3) актуально для версии 2.07
4) 8 столбцов по 20 строк каждый
5) перевод оригинальной справки, вызываемой командой –help):
  • pwgen [ опции ] [ длина пароля ] [ количество ]
  • -c - включать в пароль минимум 1 букву в «верхнем регистре»;
  • -A - исключить использование букв в «верхнем регистре»;
  • -n - включать в пароль минимум 1 цифру;
  • -0 - исключить использование цифр;
  • -y - включить в пароль «специальные символы» (!@#$%^&*()_=);
  • -s - генерировать «совершенно случайные» пароли («повышенной стойкости»);
  • -B - исключить «неоднозначные символы» в пароле((которые можно перепутать
passw_gen.txt · Последние изменения: 2014/10/29 11:30 — Alex