Как создать генератор паролей на kotlin?

password generator
password generator

Привет блог. Сегодня небольшая заметка про то как создать генератор паролей на Kotlin. Но не будем откладывать все в долгий ящик — поехали.

PassGen

Для начала создадим функцию, которая собственно и будет создавать наш пароль. Параметры метод будет принимать следующие

  • size — длинна пароля
  • useDigits — опция позволяет использовать цифры (по умолчанию — true)
  • useSigns — опция позволяет использовать спец символы (по умолчанию — false)
  • useUpper — опция позволяет использовать заглавные буквы (по умолчанию — false)

Далее создадим три переменные — letters, digits, signs, которые как следует из названия будут содержать — буквы, цифры и символы. Возвращать сей метод будет обычную строку из букв, символов и цифр.

fun passGen(size: Int, useDigits: Boolean = true, useSigns: Boolean = false, useUpper: Boolean = false): String {
    val letters = "abcdefghijklmnopqrstuvwxyz"
    val digits = "1234567890"
    val signs = "%*)?@#$~_"
  
    return "my password"
}

String.randchars

Чтобы получить случайные символы из наших переменных напишем функцию расширения для стандартного класса String.

fun String.randchars(limit: Int, useUpper: Boolean): String {
    val res: StringBuilder = StringBuilder()

    (1..limit).forEach {
        val randomFactor = Random.nextInt(2)
        val randomChar = this[Random.nextInt(0,this.length)]

        when(randomFactor > 0 && useUpper) {
            true -> res.append(randomChar.toUpperCase())
            else -> res.append(randomChar)
        }

    }
    return res.toString()
}

В качестве параметров функция randchars принимает — limit (количество символов) и useUpper, который либо разрешает либо запрещает использовать заглавные буквы. В самом методе мы обходим по списку все символы и выбираем их в количестве — limit случайным образом. Если useUpper = true, то случайным образом преобразуем символ в заглавный.

Финальный вариант passGen

Теперь доработаем логику в passGen() чтобы наш генератор паролей работал как надо

fun passGen(size: Int, useDigits: Boolean = true, useSigns: Boolean = false, useUpper: Boolean = false): String {
    val letters = "abcdefghijklmnopqrstuvwxyz"
    val digits = "1234567890"
    val signs = "%*)?@#$~_"

    val randLetters =  letters.randchars(size,useUpper)
    val randDigits = digits.randchars(size,false)
    val randSigns = signs.randchars(size,false)

    val passString = when {
        useDigits && !useSigns -> randLetters + randDigits
        useDigits && useSigns -> randLetters + randDigits + randSigns
        else -> randLetters
    }
    return passString.toList().shuffled().take(size).joinToString("")
}

В зависимости от указанных опций, мы в операторе when получаем пароль: из цифр, букв и символов, из букв и цифр, либо же содержащий только буквы. Чтобы получить рандомную последовательность, преобразуем строку в список (toList), затем перемешаем там все (shuffled) и возьмем нужное количество (take). Затем преобразуем все в строку — joinToString(«»)

Здесь letters.randchars(size,useUpper) мы передаем количество символов равное size. Но можно указывать свое, тогда количество букв, цифр и символов в генераторе паролей будет ассиметричным. Можно также прописать формулу, по которой будет рассчитываться их соотношение.

Выводы

Это простой генератор паролей сгодится для использования, но некоторые решения тут не оптимальны и могут быть улучшены. К примеру можно все(знаки, цифры, символы) хранить в отдельной строке или же цифры генерировать с помощью класса Random. В общем, если захочется — можно смело улучшать и улучшать.

В следующей статье мы рассмотрим применение побитовых операторов для работы с цветом и создания изображений.

Оставить ответ