Безопасное создание паролей с помощью случайных символов

Я пытаюсь сгенерировать случайный пароль, который содержит специальные символы с использованием ruby. Я хотел бы знать, есть ли стандарт для генерации таких паролей. Я рассмотрел возможность использования взвешенного распределения вероятностей и назначения весов таким образом, чтобы была более высокая вероятность выбора специальных символов из, но я не уверен, является ли это широко принятым стандартом.

4 ответа

Решение

Вы можете использовать SecureRandom ( документы):

require 'securerandom'

password = SecureRandom.base64(15)
# => "vkVuWvPUWSMcZf9nn/dO"

Ruby поставляется только с таким модулем SecureRandom, Вы можете генерировать случайные строки:

require "securerandom"

SecureRandom.hex 1 # => "e1"
SecureRandom.hex 2 # => "dcdd"
SecureRandom.hex 3 # => "93edc6"
SecureRandom.hex 5 # => "01bf5657ce"
SecureRandom.hex 8 # => "3cc72f70146ea286"

SecureRandom.base64 2  # => "d5M="
SecureRandom.base64 3  # => "EJ1K"
SecureRandom.base64 5  # => "pEeGO68="
SecureRandom.base64 8  # => "muRa+tO0RqU="
SecureRandom.base64 13 # => "1f8y7xsvaCEw0hwkjg=="

В настоящее время существует криптографически защищенная версия вышеупомянутого SysRandom, которую некоторые люди рекомендуют.

С жемчужиной simple-password-gen Вы также можете генерировать случайные и произносимые пароли:

require "simple-password-gen"

Password.random 8 # => "#TFJ)Vtz3"
Password.pronounceable 13 # => "vingastusystaqu"

Наконец, и просто для удовольствия (я рекомендую SysRandom), я недавно написал небольшой гем, чтобы генерировать случайные строки на основе шаблонных строк. Хотя это не включает специальные символы, это было бы тривиальным дополнением. Не стесняйтесь задавать вопросы, если они вас интересуют.

Встроенный в модуль имеет удобные методы, начиная с RubyRubySecureRandom 2.5.

      require "securerandom"

# If you need A-Za-z0-9
SecureRandom.alphanumeric(10)

# If you want to specify characters (excluding similar characters)
# However, this method is NOT PUBLIC and it might be changed someday.
SecureRandom.send(:choose, [*'A'..'Z', *'a'..'z', *'0'..'9'] - ['I', 'l', '1', 'O', '0'], 10)

# Old ruby compatible version
chars = [*'A'..'Z', *'a'..'z', *'0'..'9']
10.times.map { chars[SecureRandom.random_number(chars.length)] }.join

Самый простой способ - использовать гем string_pattern https://github.com/MarioRuiz/string_pattern

Это сгенерирует 1000 уникальных строк от 6 до 20 символов, включая буквы, и заставит включать специальные символы и цифры

require 'string_pattern'
1000.times {
    puts :"6-20:L/$N/&".gen 
}
Другие вопросы по тегам