Представляю вашему вниманию перевод статьи «Creating random, secure passwords in Go» автора Mihalis Tsoukalos.
Пишем простой генератор случайных паролей на Go с помощью стандартной библиотеки.
Генератор случайных чисел в Go это хороший вариант для генерации сложных к подбору паролей.
Вы можете использовать генератор случайных чисел, предоставляемый языком программирования Go, для генерации сложных паролей, состоящих из ASCII-символов. Хотя код, представленный в этой статье, легко читается, лучше всего, если вы уже знаете основы Go, чтобы понять его. Если вы новичок в языке программирования, пройдите Tour of Go, чтобы узнать больше, а затем вернитесь сюда.
Перед тем, как перейти к утилитам и коду, взгляните на это подмножество таблицы ASCII, найденное в выводе команды man ascii:
Печатаемые десятичные значения ASCII-символов варьируются в диапазоне от 33 до 126; никакие другие значения ASCII не подходят для включения в пароли. Поэтому утилиты, представленные в этой статье, будут печатать ASCII-символы в этом диапазоне.
Создание случайных чисел
Первая утилита называется random.go и генерирует заданное количество случайных чисел, находящихся в заданном диапазоне. Наиболее важной частью random.go является эта функция:
func random(min, max int) int {
return rand.Intn(max-min) + min
}
Эта функция генерирует случайные целые числа, принадлежащие заданному диапазону с помощью функции rand.Intn() в Go. Обратите внимание, что rand.Intn() возвращает неотрицательное случайное число, принадлежащее [0,n); функция будет паниковать, если ее аргументом будет отрицательное число. Сообщение о панике будет таким: invalid argument to Intn. Документацию по пакету math/rand можно найти в документации.
Утилита random.go принимает три параметра командной строки: минимальное значение генерируемых целых чисел, максимальное значение и количество генерируемых целых чисел.
Компиляция и выполнение random.go создаст такой вывод:
$ go build random.go
$ ./random
Usage: ./random MIX MAX TOTAL
$ ./random 1 3 10
2 2 1 2 2 1 1 2 2 1
Если вы хотите генерировать более безопасные случайные числа в Go, воспользуйтесь пакетом crypto/rand библиотеки Go.
Создание случайных паролей
Вторая утилита, randomPass.go, генерирует случайные пароли. randomPass.go использует функцию random() для генерации случайных чисел, которые будут преобразовываться в ASCII символы с помощью следующего кода Go:
for {
myRand := random(MIN, MAX)
newChar := string(startChar[0] + byte(myRand))
fmt.Print(newChar)
if i == LENGTH {
break
}
i++
}
Значение MIN равно 0, значение MAX равно 94, а значение startChar равно !, что является первым печатным символом в ASCII таблице (с десятичным ASCII кодом 33). Таким образом, все ASCII-символы, которые будут сгенерированы, находятся после! и перед символом ~, который имеет десятичный ASCII-код 126.
Таким образом, каждое генерируемое случайное число больше чем MIN, меньше чем MAX, и преобразуется в ASCII символ. Процесс продолжается до тех пор, пока сгенерированный пароль не будет иметь нужную длину.
Утилита randomPass.go принимает один (необязательный) параметр командной строки, который определяет длину генерируемого пароля. Его значение по умолчанию равно восьми, что является довольно распространенной длиной пароля. При выполнении утилиты randomPass.go генерируется следующий вид вывода:
$ go run randomPass.go 1
Z
$ go run randomPass.go 10
#Cw^a#IwkT
$ go run randomPass.go
Using default values!
[PP8@'Ci
Последняя деталь: Не забудьте вызвать rand.Seed() с начальным значением, чтобы инициализировать генератор случайных чисел. Если вы постоянно используете одно и то же начальное значение, генератор случайных чисел создаст одну и ту же последовательность случайных чисел.
Вы можете найти random.go и randomPass.go на GitHub. Также, вы можете запустить их на play.golang.org.