Продвинутый генератор паролей

Создавайте безопасные пароли для всех ваших учетных записей.

Исходный код доступен в конце страницы.

Вы можете:

  • Использовать его в своих проектах — полностью или частично.
  • Изучить принципы работы — код написан на чистом JavaScript и хорошо прокомментирован.
  • Взять за основу для создания собственных инструментов.

Сгенерировать пароль:

Длина пароля: 12

Сложность пароля

Надежность: 0%
Очень слабый

Типы символов

Дополнительные опции

Скопировано!

Принцип работы генератора паролей

Эта веб-программа позволяет создавать четыре типа паролей с гибкими настройками:

Стандартный пароль

  • Генерирует случайную комбинацию символов (A-Z, a-z, 0-9, спецсимволы).
  • Настройки: длина (4–64 символа), исключение похожих символов (1, l, I, 0, O), запрет повторов и последовательностей (123, abc).
  • Оценка надежности: учитывает длину, разнообразие символов и сложность.

Запоминаемый пароль

  • Состоит из английских слов (например, AppleWind7Star), разделенных цифрами/символами.
  • Оптимален для сервисов, где важна простота запоминания.

PIN-код

  • Цифровая комбинация (4–64 цифры).
  • Подходит для банковских карт, SIM-карт, но не рекомендуется как основной пароль.

Парольная фраза

  • Случайные слоги с заглавными буквами и разделителями (например, Vufi-Taqo%Kedu).
  • Баланс между надежностью и удобством запоминания.

Технические особенности

  • Адаптивный дизайн: корректно отображается на ПК и мобильных устройствах.
  • Безопасность: пароли генерируются в браузере, не передаются на сервер.

Инструменты:

  1. Кнопка «Копировать» для быстрого сохранения.
  2. Визуальный индикатор надежности (от «Очень слабый» до «Отличный»).
  3. Подсказки с рекомендациями для каждого типа пароля.

Как использовать код

  1. Скопируйте HTML, CSS и JavaScript в один файл (например, password-generator.html).
  2. Загрузите на сайт, или же просто откройте готовый html в браузере — программа работает без серверной части.
  3. Для кастомизации измените:
  • Цвета в CSS (переменные --primary-color, --secondary-color).
  • Словарь для запоминаемых паролей (массив vifedWords в JS).

Исходный код продвинутого генератора паролей:

HTML:

  1. <div class="vifed-container">
  2.  
  3. <!-- Пресеты для выбора типа пароля -->
  4. <div class="vifed-presets">
  5. <button id="vifed-preset-default" class="active">По умолчанию</button>
  6. <button id="vifed-preset-memorable">Запоминаемый пароль</button>
  7. <button id="vifed-preset-pin">PIN-код</button>
  8. <button id="vifed-preset-passphrase">Парольная фраза</button>
  9. </div>
  10.  
  11. <!-- Пояснительное сообщение (будет заполняться динамически) -->
  12. <div class="vifed-notice" id="vifed-notice"></div>
  13.  
  14. <!-- Основные настройки -->
  15. <div class="vifed-settings">
  16. <div class="vifed-setting-column">
  17. <div class="vifed-setting-group">
  18. <h3>Длина пароля: <span id="vifed-length-value">12</span></h3>
  19. <div class="vifed-range-container">
  20. <input type="range" id="vifed-length" min="4" max="64" value="12">
  21. <input type="number" id="vifed-length-number" min="4" max="64" value="12">
  22. </div>
  23. </div>
  24.  
  25. <div class="vifed-setting-group">
  26. <h3>Сложность пароля</h3>
  27. <div class="vifed-strength-meter">
  28. <div class="vifed-strength-title">
  29. <span>Надежность:</span>
  30. <span id="vifed-strength-percent">0%</span>
  31. </div>
  32. <div class="vifed-strength-bar">
  33. <div class="vifed-strength-fill" id="vifed-strength-fill"></div>
  34. </div>
  35. <div class="vifed-strength-text" id="vifed-strength-text">Очень слабый</div>
  36. </div>
  37. </div>
  38. </div>
  39.  
  40. <div class="vifed-setting-column">
  41. <div class="vifed-setting-group">
  42. <h3>Типы символов</h3>
  43. <div class="vifed-checkbox-group">
  44. <label class="vifed-checkbox-label">
  45. <input type="checkbox" id="vifed-uppercase" checked>
  46. <span>Заглавные буквы (A-Z)</span>
  47. </label>
  48. <label class="vifed-checkbox-label">
  49. <input type="checkbox" id="vifed-lowercase" checked>
  50. <span>Строчные буквы (a-z)</span>
  51. </label>
  52. <label class="vifed-checkbox-label">
  53. <input type="checkbox" id="vifed-numbers" checked>
  54. <span>Цифры (0-9)</span>
  55. </label>
  56. <label class="vifed-checkbox-label">
  57. <input type="checkbox" id="vifed-symbols" checked>
  58. <span>Спецсимволы (!@#$%^&*)</span>
  59. </label>
  60. </div>
  61. </div>
  62.  
  63. <div class="vifed-setting-group">
  64. <h3>Дополнительные опции</h3>
  65. <div class="vifed-checkbox-group">
  66. <label class="vifed-checkbox-label">
  67. <input type="checkbox" id="vifed-avoid-similar">
  68. <span>Исключать похожие символы (1,l,I,0,O)</span>
  69. </label>
  70. <label class="vifed-checkbox-label">
  71. <input type="checkbox" id="vifed-no-duplicates">
  72. <span>Не повторять символы</span>
  73. </label>
  74. <label class="vifed-checkbox-label">
  75. <input type="checkbox" id="vifed-no-sequential">
  76. <span>Исключать последовательности (123, abc)</span>
  77. </label>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82.  
  83. <!-- Область отображения пароля -->
  84. <div class="vifed-password-display">
  85. <input type="text" id="vifed-password" readonly>
  86. <button id="vifed-copy-btn">Копировать</button>
  87. <div class="vifed-copy-notification" id="vifed-copy-notification">Скопировано!</div>
  88. </div>
  89. <!-- Кнопка генерации -->
  90. <button class="vifed-generate-btn" id="vifed-generate-btn">Сгенерировать</button>
  91. </div>

CSS:

  1. /* Основные стили для контейнера */
  2. .vifed-container {
  3. max-width: 800px;
  4. margin: 0 auto;
  5. background: #ffffff;
  6. padding: 30px;
  7. border-radius: 5px;
  8. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
  9. font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  10. }
  11.  
  12. /* Заголовок и описание */
  13. .vifed-container h1 {
  14. color: #2c5364;
  15. text-align: center;
  16. margin-bottom: 20px;
  17. }
  18.  
  19. .vifed-description {
  20. text-align: center;
  21. margin-bottom: 30px;
  22. color: #666;
  23. }
  24.  
  25. /* Стили для пресетов */
  26. .vifed-presets {
  27. display: flex;
  28. gap: 10px;
  29. justify-content: center;
  30. flex-wrap: wrap;
  31. margin-bottom: 20px;
  32. }
  33.  
  34. .vifed-presets button {
  35. padding: 8px 15px;
  36. background: #e9ecef;
  37. color: #495057;
  38. border: none;
  39. border-radius: 5px;
  40. cursor: pointer;
  41. font-size: 0.9rem;
  42. transition: all 0.3s;
  43. }
  44.  
  45. .vifed-presets button.active {
  46. background: #2c5364;
  47. color: white;
  48. }
  49.  
  50. .vifed-presets button:hover:not(.active) {
  51. background: #d1d7dc;
  52. }
  53.  
  54. /* Область отображения пароля */
  55. .vifed-password-display {
  56. display: flex;
  57. margin-bottom: 20px;
  58. position: relative;
  59. }
  60.  
  61. #vifed-password {
  62. flex-grow: 1;
  63. padding: 15px;
  64. font-size: 1.1rem;
  65. border: 1px solid #ddd;
  66. border-radius: 5px 0 0 5px;
  67. background-color: #f8f9fa;
  68. font-family: 'Courier New', monospace;
  69. }
  70.  
  71. #vifed-copy-btn {
  72. padding: 0 20px;
  73. background: #8b7355;
  74. color: white;
  75. border: none;
  76. border-radius: 0 5px 5px 0;
  77. cursor: pointer;
  78. font-size: 1rem;
  79. transition: background 0.3s;
  80. }
  81.  
  82. #vifed-copy-btn:hover {
  83. background: #3a7bd5;
  84. }
  85.  
  86. /* Уведомление о копировании */
  87. .vifed-copy-notification {
  88. position: absolute;
  89. right: 10px;
  90. top: -25px;
  91. background: #28a745;
  92. color: white;
  93. padding: 5px 10px;
  94. border-radius: 3px;
  95. font-size: 0.8rem;
  96. opacity: 0;
  97. transition: opacity 0.3s;
  98. }
  99.  
  100. /* Блок с настройками */
  101. .vifed-settings {
  102. display: grid;
  103. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  104. gap: 20px;
  105. margin-bottom: 20px;
  106. }
  107.  
  108. /* Группа настроек */
  109. .vifed-setting-group {
  110. margin-bottom: 15px;
  111. }
  112.  
  113. .vifed-setting-group h3 {
  114. margin-bottom: 10px;
  115. color: #2c5364;
  116. font-size: 1rem;
  117. }
  118.  
  119. /* Слайдер длины пароля */
  120. .vifed-range-container {
  121. display: flex;
  122. align-items: center;
  123. gap: 10px;
  124. }
  125.  
  126. .vifed-range-container input[type="range"] {
  127. flex-grow: 1;
  128. }
  129.  
  130. .vifed-range-container input[type="number"] {
  131. width: 60px;
  132. padding: 5px;
  133. border: 1px solid #ddd;
  134. border-radius: 3px;
  135. }
  136.  
  137. /* Чекбоксы */
  138. .vifed-checkbox-group {
  139. display: flex;
  140. flex-direction: column;
  141. gap: 8px;
  142. }
  143.  
  144. .vifed-checkbox-label {
  145. display: flex;
  146. align-items: center;
  147. gap: 8px;
  148. cursor: pointer;
  149. user-select: none;
  150. }
  151.  
  152. /* Кнопка генерации */
  153. .vifed-generate-btn {
  154. display: block;
  155. width: 100%;
  156. padding: 12px;
  157. background: #2c5364;
  158. color: white;
  159. border: none;
  160. border-radius: 5px;
  161. cursor: pointer;
  162. font-size: 1.1rem;
  163. transition: background 0.3s;
  164. margin-bottom: 20px;
  165. }
  166.  
  167. .vifed-generate-btn:hover {
  168. background: #3a7bd5;
  169. }
  170.  
  171. /* Индикатор надежности */
  172. .vifed-strength-meter {
  173. padding: 15px;
  174. background: #f8f9fa;
  175. border-radius: 5px;
  176. margin-bottom: 15px;
  177. }
  178.  
  179. .vifed-strength-title {
  180. display: flex;
  181. justify-content: space-between;
  182. margin-bottom: 10px;
  183. }
  184.  
  185. .vifed-strength-bar {
  186. height: 10px;
  187. background: #e9ecef;
  188. border-radius: 5px;
  189. overflow: hidden;
  190. }
  191.  
  192. .vifed-strength-fill {
  193. height: 100%;
  194. width: 0%;
  195. transition: width 0.3s, background 0.3s;
  196. }
  197.  
  198. .vifed-strength-text {
  199. margin-top: 5px;
  200. font-size: 0.9rem;
  201. text-align: right;
  202. color: #666;
  203. }
  204.  
  205. /* Пояснительные сообщения */
  206. .vifed-notice {
  207. padding: 12px;
  208. background: #f8f9fa;
  209. border-left: 4px solid #3a7bd5;
  210. border-radius: 3px;
  211. margin-bottom: 15px;
  212. font-size: 0.9rem;
  213. line-height: 1.5;
  214. }
  215.  
  216. .vifed-notice.warning {
  217. border-left-color: #ffc107;
  218. background: #fff8e1;
  219. }
  220.  
  221. /* Адаптивность */
  222. @media (max-width: 600px) {
  223. .vifed-container {
  224. padding: 20px;
  225. }
  226.  
  227. .vifed-settings {
  228. grid-template-columns: 1fr;
  229. }
  230.  
  231. .vifed-password-display {
  232. flex-direction: column;
  233. }
  234.  
  235. #vifed-password {
  236. border-radius: 5px;
  237. margin-bottom: 10px;
  238. }
  239.  
  240. #vifed-copy-btn {
  241. border-radius: 5px;
  242. padding: 10px;
  243. }
  244. }

JavaScript:

  1. // DOM элементы
  2. const vifedPasswordInput = document.getElementById('vifed-password');
  3. const vifedCopyBtn = document.getElementById('vifed-copy-btn');
  4. const vifedCopyNotification = document.getElementById('vifed-copy-notification');
  5. const vifedGenerateBtn = document.getElementById('vifed-generate-btn');
  6. const vifedLengthSlider = document.getElementById('vifed-length');
  7. const vifedLengthNumber = document.getElementById('vifed-length-number');
  8. const vifedLengthValue = document.getElementById('vifed-length-value');
  9. const vifedUppercaseCheckbox = document.getElementById('vifed-uppercase');
  10. const vifedLowercaseCheckbox = document.getElementById('vifed-lowercase');
  11. const vifedNumbersCheckbox = document.getElementById('vifed-numbers');
  12. const vifedSymbolsCheckbox = document.getElementById('vifed-symbols');
  13. const vifedAvoidSimilarCheckbox = document.getElementById('vifed-avoid-similar');
  14. const vifedNoDuplicatesCheckbox = document.getElementById('vifed-no-duplicates');
  15. const vifedNoSequentialCheckbox = document.getElementById('vifed-no-sequential');
  16. const vifedStrengthFill = document.getElementById('vifed-strength-fill');
  17. const vifedStrengthPercent = document.getElementById('vifed-strength-percent');
  18. const vifedStrengthText = document.getElementById('vifed-strength-text');
  19. const vifedNotice = document.getElementById('vifed-notice');
  20. const vifedPresetDefault = document.getElementById('vifed-preset-default');
  21. const vifedPresetMemorable = document.getElementById('vifed-preset-memorable');
  22. const vifedPresetPin = document.getElementById('vifed-preset-pin');
  23. const vifedPresetPassphrase = document.getElementById('vifed-preset-passphrase');
  24.  
  25. // Текущий активный пресет
  26. let currentPreset = 'default';
  27.  
  28. // Наборы символов
  29. const vifedCharSets = {
  30. uppercase: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  31. lowercase: 'abcdefghijklmnopqrstuvwxyz',
  32. numbers: '0123456789',
  33. symbols: '!@#$%^&*()_+-=[]{}|;:,.<>?',
  34. similarChars: '1lIiIoO0',
  35. vowels: 'aeiouy',
  36. consonants: 'bcdfghjklmnpqrstvwxz'
  37. };
  38.  
  39. // Словарь для генерации запоминаемых паролей
  40. const vifedWords = [
  41. 'apple', 'banana', 'orange', 'grape', 'lemon', 'peach', 'pear',
  42. 'cat', 'dog', 'bird', 'fish', 'lion', 'tiger', 'bear',
  43. 'sun', 'moon', 'star', 'cloud', 'rain', 'snow', 'wind',
  44. 'happy', 'brave', 'calm', 'gentle', 'honest', 'lucky', 'quiet',
  45. 'river', 'mountain', 'forest', 'ocean', 'desert', 'valley', 'island',
  46. 'book', 'pen', 'paper', 'computer', 'phone', 'keyboard', 'screen'
  47. ];
  48.  
  49. // Инициализация
  50. document.addEventListener('DOMContentLoaded', () => {
  51. // Связываем ползунок и числовое поле
  52. vifedLengthSlider.addEventListener('input', () => {
  53. vifedLengthNumber.value = vifedLengthSlider.value;
  54. vifedLengthValue.textContent = vifedLengthSlider.value;
  55. vifedGeneratePassword();
  56. });
  57.  
  58. vifedLengthNumber.addEventListener('input', () => {
  59. if (vifedLengthNumber.value > 64) vifedLengthNumber.value = 64;
  60. if (vifedLengthNumber.value < 4) vifedLengthNumber.value = 4;
  61. vifedLengthSlider.value = vifedLengthNumber.value;
  62. vifedLengthValue.textContent = vifedLengthNumber.value;
  63. vifedGeneratePassword();
  64. });
  65.  
  66. // Обработчики для всех чекбоксов
  67. document.querySelectorAll('.vifed-checkbox-group input[type="checkbox"]').forEach(checkbox => {
  68. checkbox.addEventListener('change', vifedGeneratePassword);
  69. });
  70.  
  71. // Обработчики кнопок
  72. vifedCopyBtn.addEventListener('click', vifedCopyPassword);
  73. vifedGenerateBtn.addEventListener('click', vifedGeneratePassword);
  74.  
  75. // Обработчики пресетов
  76. vifedPresetDefault.addEventListener('click', () => vifedSetPreset('default'));
  77. vifedPresetMemorable.addEventListener('click', () => vifedSetPreset('memorable'));
  78. vifedPresetPin.addEventListener('click', () => vifedSetPreset('pin'));
  79. vifedPresetPassphrase.addEventListener('click', () => vifedSetPreset('passphrase'));
  80.  
  81. // Генерируем первый пароль
  82. vifedGeneratePassword();
  83. });
  84.  
  85. // Установка активного пресета
  86. function vifedSetPreset(preset) {
  87. currentPreset = preset;
  88.  
  89. // Обновляем активную кнопку пресета
  90. vifedPresetDefault.classList.remove('active');
  91. vifedPresetMemorable.classList.remove('active');
  92. vifedPresetPin.classList.remove('active');
  93. vifedPresetPassphrase.classList.remove('active');
  94.  
  95. document.getElementById(`vifed-preset-${preset}`).classList.add('active');
  96.  
  97. // Обновляем доступные настройки
  98. vifedUpdateSettingsVisibility();
  99.  
  100. // Генерируем пароль
  101. vifedGeneratePassword();
  102. }
  103.  
  104. // Обновление видимости настроек
  105. function vifedUpdateSettingsVisibility() {
  106. // Все чекбоксы сначала включаем
  107. vifedUppercaseCheckbox.disabled = false;
  108. vifedLowercaseCheckbox.disabled = false;
  109. vifedNumbersCheckbox.disabled = false;
  110. vifedSymbolsCheckbox.disabled = false;
  111. vifedAvoidSimilarCheckbox.disabled = false;
  112. vifedNoDuplicatesCheckbox.disabled = false;
  113. vifedNoSequentialCheckbox.disabled = false;
  114.  
  115. // Для каждого пресета свои ограничения
  116. switch(currentPreset) {
  117. case 'default':
  118. break;
  119.  
  120. case 'memorable':
  121. vifedUppercaseCheckbox.disabled = true;
  122. vifedUppercaseCheckbox.checked = false;
  123. vifedAvoidSimilarCheckbox.disabled = true;
  124. vifedAvoidSimilarCheckbox.checked = false;
  125. vifedNoDuplicatesCheckbox.disabled = true;
  126. vifedNoDuplicatesCheckbox.checked = false;
  127. vifedNoSequentialCheckbox.disabled = true;
  128. vifedNoSequentialCheckbox.checked = false;
  129. break;
  130.  
  131. case 'pin':
  132. vifedUppercaseCheckbox.disabled = true;
  133. vifedUppercaseCheckbox.checked = false;
  134. vifedLowercaseCheckbox.disabled = true;
  135. vifedLowercaseCheckbox.checked = false;
  136. vifedSymbolsCheckbox.disabled = true;
  137. vifedSymbolsCheckbox.checked = false;
  138. vifedAvoidSimilarCheckbox.disabled = true;
  139. vifedAvoidSimilarCheckbox.checked = false;
  140. vifedNoDuplicatesCheckbox.disabled = true;
  141. vifedNoDuplicatesCheckbox.checked = false;
  142. vifedNoSequentialCheckbox.disabled = true;
  143. vifedNoSequentialCheckbox.checked = false;
  144. break;
  145.  
  146. case 'passphrase':
  147. vifedNumbersCheckbox.disabled = true;
  148. vifedNumbersCheckbox.checked = false;
  149. vifedSymbolsCheckbox.disabled = true;
  150. vifedSymbolsCheckbox.checked = false;
  151. vifedAvoidSimilarCheckbox.disabled = true;
  152. vifedAvoidSimilarCheckbox.checked = false;
  153. vifedNoDuplicatesCheckbox.disabled = true;
  154. vifedNoDuplicatesCheckbox.checked = false;
  155. vifedNoSequentialCheckbox.disabled = true;
  156. vifedNoSequentialCheckbox.checked = false;
  157. break;
  158. }
  159. }
  160.  
  161. // Основная функция генерации пароля
  162. function vifedGeneratePassword() {
  163. switch(currentPreset) {
  164. case 'default':
  165. vifedGenerateDefaultPassword();
  166. break;
  167. case 'memorable':
  168. vifedGenerateMemorablePassword();
  169. break;
  170. case 'pin':
  171. vifedGeneratePin();
  172. break;
  173. case 'passphrase':
  174. vifedGeneratePassphrase();
  175. break;
  176. }
  177. }
  178.  
  179. // Генерация стандартного пароля
  180. function vifedGenerateDefaultPassword() {
  181. if (!vifedUppercaseCheckbox.checked && !vifedLowercaseCheckbox.checked &&
  182. !vifedNumbersCheckbox.checked && !vifedSymbolsCheckbox.checked) {
  183. vifedPasswordInput.value = 'Выберите хотя бы один тип символов';
  184. vifedUpdateNotice('default', false);
  185. return;
  186. }
  187.  
  188. const length = parseInt(vifedLengthSlider.value);
  189. let charset = '';
  190.  
  191. if (vifedUppercaseCheckbox.checked) {
  192. charset += vifedAvoidSimilarCheckbox.checked ?
  193. vifedCharSets.uppercase.replace(/[IO]/g, '') : vifedCharSets.uppercase;
  194. }
  195.  
  196. if (vifedLowercaseCheckbox.checked) {
  197. charset += vifedAvoidSimilarCheckbox.checked ?
  198. vifedCharSets.lowercase.replace(/[l]/g, '') : vifedCharSets.lowercase;
  199. }
  200.  
  201. if (vifedNumbersCheckbox.checked) {
  202. charset += vifedAvoidSimilarCheckbox.checked ?
  203. vifedCharSets.numbers.replace(/[01]/g, '') : vifedCharSets.numbers;
  204. }
  205.  
  206. if (vifedSymbolsCheckbox.checked) {
  207. charset += vifedCharSets.symbols;
  208. }
  209.  
  210. if (charset.length === 0) {
  211. vifedPasswordInput.value = 'Недостаточно символов после фильтрации';
  212. vifedUpdateNotice('default', false);
  213. return;
  214. }
  215.  
  216. let password = '';
  217. const usedChars = new Set();
  218.  
  219. for (let i = 0; i < length; i++) {
  220. let randomChar;
  221. let attempts = 0;
  222. const maxAttempts = 100;
  223.  
  224. do {
  225. randomChar = charset[Math.floor(Math.random() * charset.length)];
  226. attempts++;
  227.  
  228. if (attempts >= maxAttempts) break;
  229.  
  230. if (vifedNoDuplicatesCheckbox.checked && usedChars.has(randomChar)) {
  231. continue;
  232. }
  233.  
  234. if (vifedNoSequentialCheckbox.checked && i > 0) {
  235. const prevCharCode = password[i-1].charCodeAt(0);
  236. const currentCharCode = randomChar.charCodeAt(0);
  237.  
  238. if (Math.abs(currentCharCode - prevCharCode) === 1) {
  239. continue;
  240. }
  241. }
  242.  
  243. break;
  244. } while (true);
  245.  
  246. if (attempts >= maxAttempts) {
  247. vifedPasswordInput.value = 'Не удалось создать пароль с выбранными параметрами';
  248. vifedUpdateNotice('default', false);
  249. return;
  250. }
  251.  
  252. password += randomChar;
  253. usedChars.add(randomChar);
  254. }
  255.  
  256. vifedPasswordInput.value = password;
  257. vifedUpdatePasswordStrength(password, 'default');
  258. vifedUpdateNotice('default', true);
  259. }
  260.  
  261. // Генерация запоминаемого пароля
  262. function vifedGenerateMemorablePassword() {
  263. const length = parseInt(vifedLengthSlider.value);
  264. const wordCount = Math.max(2, Math.floor(length / 5));
  265. let password = '';
  266.  
  267. for (let i = 0; i < wordCount; i++) {
  268. const randomWord = vifedWords[Math.floor(Math.random() * vifedWords.length)];
  269. const capitalizedWord = Math.random() > 0.5 ?
  270. randomWord.charAt(0).toUpperCase() + randomWord.slice(1) :
  271. randomWord;
  272.  
  273. password += capitalizedWord;
  274.  
  275. if (i < wordCount - 1) {
  276. let separators = '';
  277.  
  278. if (vifedNumbersCheckbox.checked) separators += vifedCharSets.numbers;
  279. if (vifedSymbolsCheckbox.checked) separators += vifedCharSets.symbols;
  280.  
  281. if (separators.length > 0) {
  282. password += separators[Math.floor(Math.random() * separators.length)];
  283. } else {
  284. password += '-';
  285. }
  286. }
  287. }
  288.  
  289. password = password.slice(0, length);
  290. vifedPasswordInput.value = password;
  291. vifedUpdatePasswordStrength(password, 'memorable');
  292. vifedUpdateNotice('memorable', true);
  293. }
  294.  
  295. // Генерация PIN-кода
  296. function vifedGeneratePin() {
  297. const length = parseInt(vifedLengthSlider.value);
  298. let pin = '';
  299.  
  300. for (let i = 0; i < length; i++) {
  301. pin += vifedCharSets.numbers[Math.floor(Math.random() * vifedCharSets.numbers.length)];
  302. }
  303.  
  304. vifedPasswordInput.value = pin;
  305. vifedUpdatePasswordStrength(pin, 'pin');
  306. vifedUpdateNotice('pin', true);
  307. }
  308.  
  309. // Генерация парольной фразы
  310. function vifedGeneratePassphrase() {
  311. const length = parseInt(vifedLengthSlider.value);
  312. let passphrase = '';
  313.  
  314. while (passphrase.length < length) {
  315. const consonant = vifedCharSets.consonants[Math.floor(Math.random() * vifedCharSets.consonants.length)];
  316. const vowel = vifedCharSets.vowels[Math.floor(Math.random() * vifedCharSets.vowels.length)];
  317.  
  318. if (passphrase.length === 0 || Math.random() > 0.7) {
  319. passphrase += consonant.toUpperCase() + vowel;
  320. } else {
  321. passphrase += consonant + vowel;
  322. }
  323.  
  324. if (passphrase.length < length - 1 && Math.random() > 0.5) {
  325. const separators = '-_';
  326. passphrase += separators[Math.floor(Math.random() * separators.length)];
  327. }
  328. }
  329.  
  330. vifedPasswordInput.value = passphrase.slice(0, length);
  331. vifedUpdatePasswordStrength(passphrase, 'passphrase');
  332. vifedUpdateNotice('passphrase', true);
  333. }
  334.  
  335. // Копирование пароля
  336. function vifedCopyPassword() {
  337. vifedPasswordInput.select();
  338. document.execCommand('copy');
  339.  
  340. vifedCopyNotification.style.opacity = '1';
  341. setTimeout(() => {
  342. vifedCopyNotification.style.opacity = '0';
  343. }, 2000);
  344. }
  345.  
  346. // Оценка сложности пароля
  347. function vifedUpdatePasswordStrength(password, type) {
  348. if (!password) return;
  349.  
  350. let score = 0;
  351. const length = password.length;
  352.  
  353. switch(type) {
  354. case 'default':
  355. score = vifedCalculateDefaultStrength(password, length);
  356. break;
  357. case 'memorable':
  358. score = vifedCalculateMemorableStrength(password, length);
  359. break;
  360. case 'pin':
  361. score = vifedCalculatePinStrength(password, length);
  362. break;
  363. case 'passphrase':
  364. score = vifedCalculatePassphraseStrength(password, length);
  365. break;
  366. }
  367.  
  368. score = Math.max(0, Math.min(100, score));
  369.  
  370. vifedStrengthFill.style.width = `${score}%`;
  371. vifedStrengthPercent.textContent = `${score}%`;
  372.  
  373. if (score < 30) {
  374. vifedStrengthFill.style.backgroundColor = '#dc3545';
  375. vifedStrengthText.textContent = 'Очень слабый';
  376. } else if (score < 60) {
  377. vifedStrengthFill.style.backgroundColor = '#ffc107';
  378. vifedStrengthText.textContent = 'Слабый';
  379. } else if (score < 80) {
  380. vifedStrengthFill.style.backgroundColor = '#28a745';
  381. vifedStrengthText.textContent = 'Хороший';
  382. } else {
  383. vifedStrengthFill.style.backgroundColor = '#007bff';
  384. vifedStrengthText.textContent = 'Отличный';
  385. }
  386. }
  387.  
  388. // Расчет надежности для стандартного пароля
  389. function vifedCalculateDefaultStrength(password, length) {
  390. let score = 0;
  391. score += Math.min(length * 4, 50);
  392.  
  393. const hasUpper = /[A-Z]/.test(password);
  394. const hasLower = /[a-z]/.test(password);
  395. const hasNumber = /[0-9]/.test(password);
  396. const hasSymbol = /[^A-Za-z0-9]/.test(password);
  397.  
  398. const charTypes = [hasUpper, hasLower, hasNumber, hasSymbol].filter(Boolean).length;
  399. score += (charTypes - 1) * 10;
  400.  
  401. const uniqueChars = new Set(password).size;
  402. if (uniqueChars < length) {
  403. score -= (length - uniqueChars) * 2;
  404. }
  405.  
  406. if (/(123|234|345|456|567|678|789|012|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)/i.test(password)) {
  407. score -= 20;
  408. }
  409.  
  410. return score;
  411. }
  412.  
  413. // Расчет надежности для запоминаемого пароля
  414. function vifedCalculateMemorableStrength(password, length) {
  415. let score = 0;
  416. score += Math.min(length * 5, 60);
  417.  
  418. const hasUpper = /[A-Z]/.test(password);
  419. const hasLower = /[a-z]/.test(password);
  420. const hasNumber = /[0-9]/.test(password);
  421. const hasSymbol = /[^A-Za-z0-9]/.test(password);
  422.  
  423. const charTypes = [hasUpper, hasLower, hasNumber, hasSymbol].filter(Boolean).length;
  424. score += (charTypes - 1) * 5;
  425.  
  426. const uniqueChars = new Set(password).size;
  427. if (uniqueChars < length) {
  428. score -= (length - uniqueChars) * 1;
  429. }
  430.  
  431. return score;
  432. }
  433.  
  434. // Расчет надежности для PIN-кода
  435. function vifedCalculatePinStrength(password, length) {
  436. let score = 0;
  437. score += Math.min(length * 6, 60);
  438.  
  439. const uniqueDigits = new Set(password).size;
  440. if (uniqueDigits < length) {
  441. score -= (length - uniqueDigits) * 3;
  442. }
  443.  
  444. if (/(123|234|345|456|567|678|789|012)/.test(password)) {
  445. score -= 30;
  446. }
  447.  
  448. return score;
  449. }
  450.  
  451. // Расчет надежности для парольной фразы
  452. function vifedCalculatePassphraseStrength(password, length) {
  453. let score = 0;
  454. score += Math.min(length * 6, 70);
  455.  
  456. if (/[A-Z]/.test(password)) {
  457. score += 10;
  458. }
  459.  
  460. if (/[-_]/.test(password)) {
  461. score += 10;
  462. }
  463.  
  464. const uniqueChars = new Set(password).size;
  465. if (uniqueChars < length) {
  466. score -= (length - uniqueChars) * 1;
  467. }
  468.  
  469. return score;
  470. }
  471.  
  472. // Обновление пояснительного сообщения
  473. function vifedUpdateNotice(type, success) {
  474. if (!success) {
  475. vifedNotice.textContent = 'Не удалось сгенерировать пароль с текущими настройками. Попробуйте изменить параметры.';
  476. vifedNotice.className = 'vifed-notice warning';
  477. return;
  478. }
  479.  
  480. switch(type) {
  481. case 'default':
  482. vifedNotice.textContent = 'Этот пароль подходит для большинства сервисов. Используйте разные пароли для разных сайтов.';
  483. vifedNotice.className = 'vifed-notice';
  484. break;
  485. case 'memorable':
  486. vifedNotice.textContent = 'Запоминаемый пароль удобен для использования, но менее безопасен, чем случайный. Рекомендуется для неважных сервисов.';
  487. vifedNotice.className = 'vifed-notice warning';
  488. break;
  489. case 'pin':
  490. vifedNotice.textContent = 'PIN-код подходит только для сервисов, где требуются именно цифры (банковские карты, SIM-карты). Не используйте PIN-код как основной пароль!';
  491. vifedNotice.className = 'vifed-notice warning';
  492. break;
  493. case 'passphrase':
  494. vifedNotice.textContent = 'Парольная фраза легко запоминается и достаточно безопасна. Хороший выбор для сервисов, где вы часто вводите пароль вручную.';
  495. vifedNotice.className = 'vifed-notice';
  496. break;
  497. }
  498. }
Нет комментариев. Ваш будет первым!
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.