Master Password — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
(Пароль сайта)
Строка 68: Строка 68:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
===Пароль сайта===
 
===Пароль сайта===
 +
SEED шаблон - это специфичный для сайта секрет для нашего пользователя, но он находится в двоичной форме, которая не полезна в качестве пароля. Чтобы преобразовать эту байтовую строку в пароль, мы должны закодировать ее как строку символов.
 +
 +
У нас есть две дополнительные проблемы, которые необходимо решить: выходной пароль должен быть простым для пользователя, чтобы он мог читать с экрана и набирать текст с клавиатуры или смартфона. Кроме того, он также должен быть совместим с политиками паролей большинства сайтов. Эти правила часто ограничивают типы паролей, которые пользователи могут назначать своим учетным записям, пытаясь скомпрометировать плохие привычки к паролям, но часто имеют обратный эффект, особенно на защищенные пароли. Как правило, это побочный эффект плохой обработки паролей сайта (например, хранение паролей с явным текстом в базе данных).
 +
 +
Мастер-пароль решает эти проблемы, вводя шаблоны типов паролей. Каждый тип пароля описывает, как должен выглядеть выходной пароль и сопоставляться с набором шаблонов. Шаблоны описывают результирующий выходной пароль, используя серию сопоставлений групп символов.
 +
 +
По умолчанию мастер-пароль использует тип длинного пароля для любых новых паролей. Пользователь может выбрать другой тип пароля, который обычно выполняется только в том случае, если политика паролей сайта несовместима с выходным паролем, созданным этим типом.
 +
 +
Чтобы создать выходной пароль, байты в SEED шаблоне кодируются в соответствии с шаблоном. Первый байт SEED шаблона используется для определения того, какой из шаблонов типа использовать для кодирования выходного пароля. Мы принимаем байтовое значение первого SEED байта по модулю количества шаблонов, установленных для выбранного типа пароля, и используем результат как индекс, основанный на нуле, в списке шаблонов для типа пароля.
 +
<syntaxhighlight lang=javascript>
 +
templates = [ "CvcvCvcvnoCvcv", "CvcvnoCvcvCvcv", "CvcvCvcvCvcvno", ... ]
 +
template  = templates[ seed[0] % count( templates ) ]
 +
</syntaxhighlight>
 +
 +
Теперь, когда мы знаем, какой шаблон использовать для создания нашего выходного пароля, осталось только переформатировать шаблон и создать для каждого шага характер вывода пароля. Когда мы перебираем шаблон (индекс i), мы смотрим в группу символов, идентифицированную символом (строка passChars) в шаблоне с индексом i.
 +
 +
Мы используем значение байта SEED шаблона в индексе i + 1 по модулю количества символов в символьном классе, чтобы определить, какой символ (passChar) в классе использовать для выходного пароля с индексом i.
 +
 +
<syntaxhighlight lang=javascript>
 +
passChar    = passChars[ seed[i + 1] % count( passChars ) ]
 +
passWord[i] = passChar
 +
</syntaxhighlight>
 +
 +
Результатом является закодированная строка passWord, которая содержит пароль, сгенерированный для сайта, например:
 +
<syntaxhighlight lang=javascript>
 +
CuzaSasy3*Rimo
 +
</syntaxhighlight>

Версия 01:28, 14 мая 2017

Master Password
Login.png
Создатели: Мартен Биллемонт
Выпущена: 15 июня 2012
Постоянный выпуск: 19 апреля 2015
Состояние разработки: Активно
Написана на: Java, C, javascript
Операционная система: Microsoft Windows, Unix-like, включая OS X, iOS и Android
Локализация: English
Лицензия: GNU General Public License
Веб-сайт masterpasswordapp.com

Мастер-пароль(Master password) - это алгоритм, разработанный Маартеном Биллемонтом для создания уникальных паролей воспроизводимым образом. Он отличается от традиционных менеджеров паролей тем, что пароли не хранятся на диске или в облаке, но каждый раз воссоздаются с использованием информации, введенной пользователем.

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

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

Применение

Thumb-process-black.png

Алгоритм

Алгоритм включает в себя следующие параметры:

  1. name: полное имя пользователя, используемое в качестве соли. Полное имя пользователя выбрано, поскольку оно обеспечивает достаточно высокий уровень энтропии, хотя вряд ли его можно забыть.
  2. master_password: секрет, используемый для создания мастер-ключа.
  3. site_name: уникальное имя службы, для которой предназначен пароль. Обычно голый доменный домен является хорошим выбором.
  4. counter: Целое число, которое может быть увеличено, когда служба запрашивает новый пароль. По умолчанию это 0.
  5. password_type: Тип пароля определяет длину и структуру результирующего пароля, см. Ниже.

Генерация master key

Master key - это 64-байтовый секретный ключ, сгенерированный путем выполнения дорогостоящего деривации ключа с использованием мастер-пароля пользователя, засоренного их полным именем. Он представляет собой глобальный секрет пользователя.

Цель этого процесса - сдерживать любые попытки грубого принуждения мастер-пароля пользователя от известного пароля сайта. Вывод ключей осуществляется с использованием алгоритма шифрования, который гарантирует, что процесс достаточно трудоемкий и ресурсоемкий, чтобы сделать грубую форсировку недопустимой атаки.

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

salt = "com.lyndir.masterpassword" + length(name) + name
master_key = scrypt(master_password, salt, 32768, 8, 2, 64)

Шаблон SEED

С известным основным ключом мы можем перейти к вычислению SEED шаблона для сайта. SEED шаблон является, по существу, сайто-специфичным секретом в двоичной форме.

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

Мы используем алгоритм HMAC-SHA-256 для получения достаточно большого количества SEED для последующего шага кодирования.

seed = hmac_sha256(master_key, "com.lyndir.masterpassword" + length(site_name) + site_name + counter)

Пароль сайта

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

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

Мастер-пароль решает эти проблемы, вводя шаблоны типов паролей. Каждый тип пароля описывает, как должен выглядеть выходной пароль и сопоставляться с набором шаблонов. Шаблоны описывают результирующий выходной пароль, используя серию сопоставлений групп символов.

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

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

templates = [ "CvcvCvcvnoCvcv", "CvcvnoCvcvCvcv", "CvcvCvcvCvcvno", ... ]
template  = templates[ seed[0] % count( templates ) ]

Теперь, когда мы знаем, какой шаблон использовать для создания нашего выходного пароля, осталось только переформатировать шаблон и создать для каждого шага характер вывода пароля. Когда мы перебираем шаблон (индекс i), мы смотрим в группу символов, идентифицированную символом (строка passChars) в шаблоне с индексом i.

Мы используем значение байта SEED шаблона в индексе i + 1 по модулю количества символов в символьном классе, чтобы определить, какой символ (passChar) в классе использовать для выходного пароля с индексом i.

passChar    = passChars[ seed[i + 1] % count( passChars ) ]
passWord[i] = passChar

Результатом является закодированная строка passWord, которая содержит пароль, сгенерированный для сайта, например:

CuzaSasy3*Rimo