Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Однострочная генерация пароля без инструмента fetch

    Однострочная генерация пароля без инструмента fetch

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Однострочная генерация пароля без инструмента fetch, RouterOS
     
    Lelik200
    Guest
    #1
    0
    24.07.2020 12:55:00
    :put ([/certificate scep-server otp generate minutes-valid=0 as-value]->“пароль”)
     
     
     
    msatter
    Guest
    #2
    0
    21.10.2020 11:16:00
    И удаляет полный пароль сразу после его генерации. {
    :local hash ([/certificate scep-server otp generate minutes-valid=0 as-value]->"password");
    /certificate scep-server otp remove [:find $hash];
    :local pwd [:pick $hash 0 8];
    :put $pwd;
    }
     
     
     
    Lelik200
    Guest
    #3
    0
    21.10.2020 12:25:00
    В качестве альтернативы, но они удаляются автоматически через несколько секунд, если вы используете "minutes-valid=0".
     
     
     
    msatter
    Guest
    #4
    0
    21.10.2020 13:45:00
    Это не сработало для меня, и сгенерированные пароли остаются в списке, несмотря на то, что счетчик сбросился до нуля. Не так просто удалить эти пароли, и проблема в том, что иногда сгенерированный пароль еще не отображается в списке. Тогда я получаю ошибку, что элемент не существует. Я до сих пор пытаюсь найти хороший способ, например, использовать on-error, чтобы скрипт продолжал работать. Обновление: становится еще страннее, когда я добавляю в Winbox таймаут 0..4294967295 (беззнаковое целое число) минут. Счетчик начинает увеличиваться, хотя в терминале все еще показывается ноль. Я на версии 6.48beta48, так что это может отличаться от других версий. Обновление 2: Я написал в поддержку Mikrotik по этому поводу.
     
     
     
    Lelik200
    Guest
    #5
    0
    21.10.2020 21:35:00
    Да, это странно. В последний раз я тестировал на 6.47.4, и всё было хорошо. Мы ждём ответа от службы поддержки.
     
     
     
    msatter
    Guest
    #6
    0
    21.10.2020 21:41:00
    Простой генератор паролей на базе Mikrotik OTP. # генерировать пароль:  
    {  
    :set $pwdLength 10;  
    # Из этой строки формируется пароль.  
    :set $pwdComposedOff "!&()*+/0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz{}";
    :set $pwdLoops ((255 + [:len $pwdComposedOff]) / [:len $pwdComposedOff]);
    :for i from=1 to=$pwdLoops do={:set $multipliedString "$multipliedString$pwdComposedOff";};  
     
    /certificate scep-server otp  
    # Генерируем достаточно хешей, чтобы получить нужное количество символов для пароля (x2).  
    :for i from=1 to=((10 + ($pwdLength-1)) / 10) do={:set $hash "$hash$([generate minutes-valid=0 as-value]->"password")";};
     
    # Группируем их каждую пару. Вычитаем 1, потому что i начинается с нуля.  
    :for i from=0 to=(($pwdLength * 2)-1) step=2 do={ \  
    :set $hex "0x$[:pick $hash $i ($i+2)]";
    :set $pwdString "$pwdString$[:pick $multipliedString ($hex-1) ($hex)]";
    };  
     
    :put "Сгенерированный пароль: $pwdString; с длиной $pwdLength";  
    /} Обновление: упростил скрипт и сделал его более гибким, установив длину пароля, и теперь генерируется только столько OTP хешей, сколько нужно, чтобы соответствовать длине пароля. Символы пароля теперь умножаются несколько раз, чтобы их общее количество превышало 255. Он адаптируется к количеству символов, которые вы введете.
     
     
     
    Jotne
    Guest
    #7
    0
    22.10.2020 09:14:00
    Спасибо за скрипт. Протестировал, также работает на бета версии 7. Для удобства я убрал все точки с запятой и ненужный </big> после "do=", а также использовал табуляцию для лучшей структуры. # генерация пароля:
    {
    :set $pwdLength 5
    # Из этой строки формируется пароль.
    :set $pwdComposedOff "!&()*+/0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz{}"
    :set $pwdLoops ((255 + [:len $pwdComposedOff]) / [:len $pwdComposedOff])
    :for i from=1 to=$pwdLoops do={
    :set $multipliedString "$multipliedString$pwdComposedOff"
    }

    /certificate scep-server otp
    # Генерируем хэш достаточно раз, чтобы получить достаточно символов для пароля (в 2 раза больше).
    :for i from=1 to=((10 + ($pwdLength-1)) / 10) do={
    :set $hash "$hash$([generate minutes-valid=0 as-value]->"password")"
    }

    # Объединяем их каждые два. Вычитаем 1, так как индексация начинается с нуля.
    :for i from=0 to=(($pwdLength * 2)-1) step=2 do={
    :set $hex "0x$[:pick $hash $i ($i+2)]"
    :set $pwdString "$pwdString$[:pick $multipliedString ($hex-1) ($hex)]"
    }

    :put "Сгенерированный пароль: \"$pwdString\" длиной $pwdLength"
    }
     
     
     
    msatter
    Guest
    #8
    0
    22.10.2020 11:32:00
    Пожалуйста, и огромное спасибо Jotne за очистку. Все эти ; были там, чтобы гарантировать, что не возникнет жалоб на их отсутствие в других настройках. / был необходим, чтобы перейти к корню меню. Это можно адаптировать, чтобы соответствовать минимальным требованиям к паролям, создав несколько составных строк и вложив циклы. Значение хекса затем определяет, какой цикл получает какую из составных строк. При выборе цикла также учитывается минимальное количество совпадений. Нужен другой способ выбора символа в составной строке, потому что они больше не умножаются. (255 / (([:len pwdComposedOf])-1) Пример: один специальный, одна заглавная буква и одна цифра, а остальное — в случайном порядке. Обновление: я добавил смешанные версии строк и добавил только буквы, только цифры и только специальные символы. Главное изменение заключается в том, что больше не нужно умножать строку, из которой состоит пароль. Код устарел и был удален.
     
     
     
    msatter
    Guest
    #9
    0
    22.10.2020 22:16:00
    Еще один шаг, и строки сохраняются в массиве, чтобы упростить выбор. Теперь также есть функция, которую можно вызвать с дополнительными параметрами: $genpassword {length} {string} {string} {string} – length — это размер пароля, а string может быть нормальным, смешанным, буквенным, mixletters, числовым, mixnumbers, специальным, mixspecial. Если строка не предоставлена, используется нормальная строка для генерации пароля. Нормальная строка содержит буквы (заглавные и строчные), цифры и специальные символы. Смешанная означает, что содержимое в случайном порядке. Код устарел и удален. Обновление 1 + 2: если длину пароля опустить, а другой параметр выбрать строку. Если один или все параметры строк неверны, отображается сообщение об ошибке, и пароль не генерируется. Кроме того, названия строк жестко прописаны в одном месте, так что изменение любого из них не требует изменения кода.
     
     
     
    msatter
    Guest
    #10
    0
    24.10.2020 14:17:00
    Еще одно дальнейшее развитие. Сделал так, чтобы только имена и строки были закодированы жестко, а всё, что зависит от них, было динамичным. Строку по умолчанию следует назвать "default", и это единственная переменная/ключ, закодированная жестко. Это была большая работа для человека, который не имеет опыта в программировании. Я не стал углубляться в минимальные требования к паролям и ищу пример хеширования и соли, чтобы вместо пароля использовать хеш и соль. Добавил пин к параметру для выбора. # генерировать пароль и сохранять его локально (функция и переменные)
    {
    :local genpassword do={ \
    :local arrayString [:toarray ""];
    # Устанавливает длину пароля
    :if ([:typeof [:tonum $1]]="nil") do={:set $pwdLength 10} else={:set $pwdLength $1}
    # Если длина не указана, сдвигает параметры на их ожидаемое место
    :if ([:typeof [:tonum $1]]="nil") do={:set $4 $3; :set $3 $2; :set $2 $1; :set $1}

    # Из этих строк формируется пароль. Они сохраняются в массиве.
    :set ($arrayString->"default")      "!&()*+/0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz{}"
    :set ($arrayString->"letters")      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    :set ($arrayString->"pin")          "0123456789"          ; :set ($arrayString->"numbers")      "0123456789"
    :set ($arrayString->"special")      "!&()*+/:;<=>@[]{}"
    :set ($arrayString->"mixed")        "67KODNoI10H>4c:b29RdG{kreA<yBtJWwfvzZUFPs;@gjEV&8n}C5hMSx(TQ3!mi/]aLul*+pX[=Yq)"
    :set ($arrayString->"mixedletters") "ogcxNhEwfMDeJAbUuQYZmITCBXLjVWdlFrtsPzqOKGHvySRikpna";
    :set ($arrayString->"mixednumbers") "8923176504"          ; :set ($arrayString->"mixednumbers") "8923176504"
    :set ($arrayString->"mixedspecial") "[]*/{+};!>:=<(@)&"

    # Выбор строки(ок) для генерации пароля. Если строка не указана, выбирается первая в массиве.
    :if ([:typeof $2] ~ "(nothing|nil)") do={ \
       :set $pwdComposedOf (get [$arrayString as-value]->"default"); } \
     else={ \
       :foreach labelName in={$2;$3;$4} do={:set $pwdComposedOf "$pwdComposedOf$(get [$arrayString as-value]->$labelName)"}
       
       # Проверка, соответствуют ли параметры ключам массива. $compareLabel адаптируется к количеству строк.    
       :foreach label,dummy in=$arrayString do={:if ($label ~ "(mixed)") do={} else={:set $compareLabel "$compareLabel$label|"}}
       :set $compareLabel "$[:pick $compareLabel 0 ([:len $compareLabel]-1)]"; :set $compareLabel "($compareLabel)"
       :foreach varname in={"$2"; "$3"; "$4"} do={:if ($varname ~ $compareLabel || [:typeof $varname]~"(nothing|nil)") do={} else={:set $pwdComposedOf ""}}
    }; # если ([typeof $2]....

    # Генерировать пароль только если строка присутствует в $pwdComposedOf. В противном случае выдает ошибку. Это не идеальная проверка.
    :if ([:len $pwdComposedOf] > 0) do={ \
      # Переход на страницу генератора OTP.
      /certificate scep-server otp
      # Генерировать достаточное количество хешей, чтобы получить достаточное количество символов для пароля (x2).
      :for i from=1 to=(($pwdLength + 9) / 10) do={:set $hash "$hash$([generate minutes-valid=0 as-value]->"password")"}
         # Группировать каждый раз по парам. Вычитаем 1, потому что начинается с нуля.
      :for i from=0 to=(($pwdLength * 2)-1) step=2 do={ \
    :set $hex "0x$[:pick $hash $i ($i+2)]"
    :set $hex (($hex * 1000000000) / (255000000000 / ([:len $pwdComposedOf]))); # Умножение на 1000000000 для увеличения точности расчетов. @без десятичных
    :set $pwdString "$pwdString$[:pick $pwdComposedOf ($hex) ($hex+1)]"
      }; # for i
      :put "Сгенерированный пароль: $pwdString с длиной $pwdLength"
      :set $pwdString; # очищает сгенерированный пароль из памяти.
      :do {:for i from=0 to=60 do={remove numbers=$i}} on-error={}
    } \

    else={ \
    :foreach label,dummy in=$arrayString do={:set $parameters "$parameters$label, "}
    :set $parameters [:pick $parameters 0 ([:len $parameters]-2)]
    :error "\r\nИспользованы недопустимые параметры. Пароль не сгенерирован. Допустимые параметры:\r\n$parameters" }
    }; # :local genpassword (функция)
    $genpassword 10 default
    } Обновление: исправлена ошибка в вычислениях с делителем, умножив на x1000, потому что RouterOS не использует десятичные дроби. Есть еще с чем поработать… Обновление2: Исправлена проверка на $2 = "ничего" до ~ "(nothing|nil)". Плюс другие оптимизации в коде.
     
     
     
    Jotne
    Guest
    #11
    0
    27.10.2020 07:54:00
    Спасибо за работу с скриптом пароля. MT должен добавить что-то подобное в качестве встроенной функции. PS: Вам не нужен \ после do и else или в конце строки, если это новая команда. * do={ * → do={
     
     
     
    msatter
    Guest
    #12
    0
    27.10.2020 11:12:00
    Это было бы здорово, и Mikrotik также мог бы использовать движок шифрования для хэширования сгенерированного пароля с добавлением соли. Тогда администратору нужно будет хранить только хэш и соль. Я работал над скриптами, и при проверке синтаксиса и ошибок разумно не находиться в корне, а быть в каталоге выше корня (например: /ip). В корне много чего можно пропустить, чего нельзя, когда ты находишься вне корня. Проблема курицы и яйца возникает, когда есть ошибка синтаксиса (используя { }), тебе выдают номер строки и позицию. Однако это не помогает в терминальном экране, потому что эти строки отображаются только тогда, когда ошибок нет. Эти строки можно сделать видимыми, нажав клавишу F5.
     
     
     
    Lelik200
    Guest
    #13
    0
    27.10.2020 12:51:00
    Должна ли строчка 17 выглядеть так? :set ($arrayString->"mixedpin") "8923176504"; :set ($arrayString->"mixednumbers") "8923176504" (“mixednumbers” → “mixedpin”)
     
     
     
    msatter
    Guest
    #14
    0
    27.10.2020 16:40:00
    Спасибо, думаю, я заменю статическую смешанную систему на динамическое смешивание, которое буду применять только при каждом вызове конкретного используемого типа.
     
     
     
    msatter
    Guest
    #15
    0
    13.11.2020 16:09:00
    Смешивание базовых строк завершено, так как я отвлёкся на написание сценария меню. Также я нашёл гораздо более быстрый и надёжный способ удалить устаревшие OTP-хэши. Сначала я пытался удалять "числа" по одному, но это не всегда срабатывало, и с более чем тринадцатью тысячами хэшей я застрял — избавиться от них можно было только перезагрузив роутер... но это не выход. Теперь я использую: remove [find where expires < 10m] в меню OTP. Это должно быть исправлено в следующей бета-версии. Так что завершённый процесс отображает меню, пароль/ПИН и смешивание базовых строк, используемых для их генерации. Создание хэшей паролей и их соль — это то, с чем я не могу справиться.
     
     
     
    msatter
    Guest
    #16
    0
    23.11.2020 22:44:00
    Создайте способ удалить сгенерированный хэш, пока автоудаление всё ещё не работает в моей версии RouterOS: :local createOTPHash [/certificate scep-server otp; ([generate minutes-valid=0 as-value]->"password") [:foreach i in=[find -1] do={:set $lastHash $i}; :do {remove $lastHash} on-error={}]]; Это создаст переменную “createOTPHash”, в которой будет сохранён хэш, и в то же время удалит последний добавленный хэш. Обновление: мне пришлось изолировать :foreach, используя дополнительные параметры при дальнейших тестированиях. Обновление 2: это работает только если уже есть существующий хэш, поэтому я добавил :do {} on-error={}. Удаление из on-error не сработало, и я не знаю, почему. Обновление 3: это не сработает, потому что хэш ещё не сохранён, поэтому удаляется предыдущий сгенерированный хэш.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры