Менеджер паролей как написать

Как я сделал себе менеджер паролей

Время на прочтение
3 мин

Количество просмотров 9.5K

Пароли — древнейший способ аутентификации в информационных технологиях, повсеместно использующийся и сегодня. Увы, просто невозможно держать в памяти пароли для всех Интернет-ресурсов при условии, что все они будут разными и сложными! Тут на помощь человеку приходят менеджеры паролей, берущие эту задачу на себя: человек запоминает всего лишь один мастер-пароль, дающий доступ ко всем остальным.

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

Первый вариант реализации этой идеи, приходящий на ум — криптографические хеш-функции. На первый взгляд, всё круто: выбираем стойкую функцию (скажем, SHA-3 в 224-битной версии), подаём ей на вход мастер-пароль qwerty и тип аккаунта vk, на выходе мгновенно получаем 56 символов из набора 0123456789abcdef. Я сходу нашёл два подобных проекта: взломанный и потенциально взламываемый. В таком подходе есть большая проблема: криптографические хеш-функции проектируются в том числе с целью быть максимально быстрыми и нетребовательными к ресурсам, и поэтому можно устроить словарный или полный перебор мастер-пароля по перехваченному паролю для одного сайта на CPU (относительно медленно), GPU, FPGA (куда быстрее), ASIC (очень быстро). Для проведения таких атак на популярные алгоритмы хеширования без использования подсаливания можно использовать также радужные таблицы, сильно ускоряющие процесс взлома на CPU.

К счастью, есть другой вариант реализации — функции получения ключей. В двух словах, они выполняют хеширование, но относительно медленно (скажем, одну секунду на обычном процессоре) и с относительно большим потреблением ресурсов (скажем, 16 мегабайт оперативной памяти), чтобы максимально затруднить атаки полным и словарным перебором. Среди знакомых мне современных функций PBKDF2, bcrypt и scrypt лучше всего выглядела scrypt: созданная с учётом опыта первых двух, успешно противостоящая вычислениям на графических процессорах и микросхемах (как FPGA, так и ASIC) и рассчитанная на гибкость при настройке под любые задачи. Я подумывал над реализацией этого проекта, но почему-то задвинул его в долгий ящик. И очень напрасно.

Криптограф Надим Кобеисси сделал как раз такой менеджер паролей npwd на JavaScript (работает как десктопное приложение через Node.JS). Я установил утилиту на компьютер под Linux и под Windows, а также на ноутбук под Linux, начал боевое использование, и мне очень понравилось. Вводишь единственный мастер-пароль и тип аккаунта (например, «twitter») в приложение, и через пару секунд в твоём буфере обмена уже лежит вычисленный сложный пароль конкретно для этого аккаунта, причём взломать твой мастер-пароль (читай: все твои пароли) по паролю для одного аккаунта будет очень, очень сложно.

Но была и проблема. Версия под Windows действительно выдавала пароль через пару секунд, а вот под Linux (в том числе на том же самом компьютере!) для вычислений требовалось уже секунд 15, что напрягало. Сначала я просто уменьшил одну константу, сделав мастер-пароль менее защищённым, но потом я подумал — а почему бы не переписать приложение на C, ведь наверняка будет работать гораздо быстрее! Особенно меня подзадоривала мысль, что у меня давно был замысел этого проекта, но я стормозил, и кто-то реализовал его до меня.

Через несколько дней неспешной работы я сделал свой менеджер паролей cpwd, полностью совместимый с оригиналом. Это было весело! После небольшой оптимизации мне удалось достичь желанной высокой скорости работы. Портировать cpwd под Windows я не пробовал, но это должно быть несложно. На GitHub-странице проекта я собрал коллекцию ссылок на подобные проекты в академическом мире и за его пределами – оказалось, что идея вообще-то весьма стара.

Конечно, это не серебряная пуля, но it works for me. В процессе использования я наткнулся на проблему: некоторые сайты имеют интересные требования к паролям типа «не более 20 символов», «обязательно встречается большая буква, маленькая буква, цифра и спецсимвол», в результате сгенерированный npwd/cpwd пароль иногда требует доработки руками перед вводом. К счастью, таких сайтов немного.

Оригинал опубликован в моём блоге 7.08.15. Прошло 5 лет, а я до сих пор пользуюсь этой утилиткой.

задание — написать троян — постановка задачи это только доказывает. И что это за препод изверг?

Совсем без вмешательства юзера — это троян и оно почти нереализуемо…Очень много тонкостей.
Можно усовершенствовать систему, пользователю даже мастер пароля не нужен, он хранится в самом приложении и вычленить его оттуда можно, но сложно, его один раз забил и забыл, потребуется только если кому файл паролей захочешь передать. ниже логика. Он все также используется для шифрования, все тот же дес и тот же икссемел. Иного ничего не могу предложить. спроси препода можно ли так сделать. Он разрешит я думаю, нет — значит поменяешь руководителя и тему, делов то. главное что б препод не обиделся…

юзер нажимает комбо, пишет логин, или перед комбо выделяет текст логина полностью, печатает пароль в нужное поле, желательно с 1 раза и без ошибок, можно требовать повтора пароля. после ввода пароля еще комбо. за время между комбо прога ловит нажатия клавишь клавиатуры и запоминает так пароль.
Далее когда пользователь хочет воспрользоваться паролем, вводит логин, выделяет, комбо, ставит куда нужно курсор, комбо, пароль введен. все.

Добавлено через 1 минуту
можно для каждого логина/пароля еще и домен сайта запоминать. тоже просто. на случай если для разных сайтов 1 логин, но разные пароли…
получить адрес страницы, наверное можно, применив тот код, что тебе дали…

  • Download source files — 25.35 KB

Introduction

I wanted for some time to write a very simple password keeper for personal use. I’m posting it in case someone else finds it useful. I think it has some interesting ideas.

Once the username/password is inputted, it’s kept encrypted. The way to use it: either by drag and drop (this is useful for HTML based forms) or SendMessage(WM_SETTEXT,...) buttons. You can look at the tool tips for each button.

So the password is never seen in the program itself in plain text unless you use the password or import previous passwords. No copy/paste to/from clipboard.

The app minimizes to a system tray. It has a hotkey (CTRL+F12). During startup, it asks for a password. When used for the first time, it will use this password to encrypt the data. Once you add your passwords, it’s a good idea to backup the file to a safe location.

Notes

  • In most cases, the sensitive information is cleared right away (doesn’t mean it’s a 100% sure way) after it’s not needed anymore through Array.Clear. But when dragging/sending the info to another window or when importing from another file, user and password is decrypted into a String and not cleared because String is immutable. So it’s left to the GC.
  • Set the appropriate NTFS permissions on the application’s directory, that’s where the password file will be.
  • It’s a good idea to modify the code that derives the encryption keys (add different iteration counts for hash, etc.) so it will be different from the version included with this article.
  • Use some .NET obfuscator. For example, at least the basic version that comes with Visual Studio 2003 (Dotfuscator community edition).

Code Snippets

The hotkey is registered and used through P/Invoke:

[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, Int32 id, 
                                   UInt32 fsModifiers, UInt32 vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, Int32 id);

Then actual WM_HOTKEY message is handled in WndProc:

protected override void WndProc(ref Message m)
{
  if (m.Msg == 0x0312) 
  {
    Visible = true;
    WindowState = FormWindowState.Normal;
    Activate();
  }
  base.WndProc(ref m);
}

The username and password use different encryption algorithms from whole file encryption. The keys and ivs are derived for two algorithms through PasswordDeriveBytes:

pdb = PasswordDeriveBytes(txtPass.Text, salt, "SHA512", 1000)

keyRij = pdb.GetBytes(32);
key3des = pdb.GetBytes(24);

ivRij = pdb.GetBytes(16);
iv3des = pdb.GetBytes(8);

In most cases, the sensitive information is cleared right away after it’s not needed anymore through Array.Clear. But when dragging/sending the info to another window, it’s decrypted into a String and not cleared because String is immutable.

string val =
IntPtr ptr = Marshal.StringToCoTaskMemAuto(val);
SendMessage(hWnd, 0x000C, 0, ptr.ToInt32());
Marshal.FreeCoTaskMem(ptr);

DoDragDrop(val, DragDropEffects.Copy);

For SendMessage case in mouse button down I’ve set Capture = true. Then in mouse button up event the Capture is set to false. And actual target window is found through P/Invoke.

[DllImport("user32.dll")]
private static extern bool ScreenToClient(IntPtr hWnd, ref SeqPoint pt);
[DllImport("user32.dll")]
private static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(SeqPoint pt);        
[DllImport("user32.dll")]
private static extern IntPtr 
   RealChildWindowFromPoint(IntPtr hWndParent, SeqPoint Point);

The actual code to find the target window:

private IntPtr FindTargetWindow(Point pt)
{
  SeqPoint seqpt = new SeqPoint();
  seqpt.x = pt.X;
  seqpt.y = pt.Y;
  IntPtr hWnd = WindowFromPoint(seqpt);

  
  if(Bounds.Contains(pt))
    return this.Handle;

  if (hWnd.ToInt64() != 0)
  {
    IntPtr hParent = GetParent(hWnd);
    if(hParent.ToInt64() != 0 && 
        ScreenToClient(hParent, ref seqpt))
    {
      hParent = RealChildWindowFromPoint(hParent, seqpt);
      if(hParent.ToInt64() != 0)
        hWnd = hParent;
    }
  }
  return hWnd;
}

When selecting the target window, there is a selection frame drawn for the target window. This is accomplished as follows:

[DllImport("gdi32.dll")]
private static extern int GetBkColor(IntPtr hdc);
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out SeqRect rect);

private void FrameTargetWnd()
{
  Point pt = Cursor.Position;
  IntPtr hWnd = FindTargetWindow(pt);
  if(hWnd.ToInt64() != 0)
  {
    SeqRect rc;
    if(GetWindowRect(hWnd, out rc))
    {
      Rectangle rect = new Rectangle(rc.left, 
         rc.top, rc.right - rc.left, rc.bottom - rc.top);
      if(rect != previousRect)
      {
        Graphics g = Graphics.FromHwnd(hWnd);
        IntPtr hDC = g.GetHdc();
        if(hDC.ToInt64() != 0)
        {
          try
          {
            if(previousRect.Height > 0 
                  || previousRect.Width > 0)
              ControlPaint.DrawReversibleFrame(previousRect, 
                  drawFrameBkColorPrev, FrameStyle.Dashed);
            
            if(hWnd != this.Handle)
            {
              
              drawFrameBkColor = Color.FromArgb(GetBkColor(hDC));
              ControlPaint.DrawReversibleFrame(rect, 
                   drawFrameBkColor, FrameStyle.Dashed);
              
              
              
              previousRect = rect;
              drawFrameBkColorPrev = drawFrameBkColor;
            }
            else
            {
              
              
              
              previousRect.Size = new Size(0,0);
            }
          }
          finally
          {
            g.ReleaseHdc(hDC);
            g.Dispose();
          }
        }
      }
    }
  }
}

Everything else is just standard .NET stuff.

Disclaimer

THIS CODE AND INFORMATION IS PROVIDED ‘AS IS’ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.

History

  • 17th August, 2003: Initial post
  • 18th October, 2008: Download file updated

This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.

  • Download source files — 25.35 KB

Introduction

I wanted for some time to write a very simple password keeper for personal use. I’m posting it in case someone else finds it useful. I think it has some interesting ideas.

Once the username/password is inputted, it’s kept encrypted. The way to use it: either by drag and drop (this is useful for HTML based forms) or SendMessage(WM_SETTEXT,...) buttons. You can look at the tool tips for each button.

So the password is never seen in the program itself in plain text unless you use the password or import previous passwords. No copy/paste to/from clipboard.

The app minimizes to a system tray. It has a hotkey (CTRL+F12). During startup, it asks for a password. When used for the first time, it will use this password to encrypt the data. Once you add your passwords, it’s a good idea to backup the file to a safe location.

Notes

  • In most cases, the sensitive information is cleared right away (doesn’t mean it’s a 100% sure way) after it’s not needed anymore through Array.Clear. But when dragging/sending the info to another window or when importing from another file, user and password is decrypted into a String and not cleared because String is immutable. So it’s left to the GC.
  • Set the appropriate NTFS permissions on the application’s directory, that’s where the password file will be.
  • It’s a good idea to modify the code that derives the encryption keys (add different iteration counts for hash, etc.) so it will be different from the version included with this article.
  • Use some .NET obfuscator. For example, at least the basic version that comes with Visual Studio 2003 (Dotfuscator community edition).

Code Snippets

The hotkey is registered and used through P/Invoke:

[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, Int32 id, 
                                   UInt32 fsModifiers, UInt32 vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, Int32 id);

Then actual WM_HOTKEY message is handled in WndProc:

protected override void WndProc(ref Message m)
{
  if (m.Msg == 0x0312) 
  {
    Visible = true;
    WindowState = FormWindowState.Normal;
    Activate();
  }
  base.WndProc(ref m);
}

The username and password use different encryption algorithms from whole file encryption. The keys and ivs are derived for two algorithms through PasswordDeriveBytes:

pdb = PasswordDeriveBytes(txtPass.Text, salt, "SHA512", 1000)

keyRij = pdb.GetBytes(32);
key3des = pdb.GetBytes(24);

ivRij = pdb.GetBytes(16);
iv3des = pdb.GetBytes(8);

In most cases, the sensitive information is cleared right away after it’s not needed anymore through Array.Clear. But when dragging/sending the info to another window, it’s decrypted into a String and not cleared because String is immutable.

string val =
IntPtr ptr = Marshal.StringToCoTaskMemAuto(val);
SendMessage(hWnd, 0x000C, 0, ptr.ToInt32());
Marshal.FreeCoTaskMem(ptr);

DoDragDrop(val, DragDropEffects.Copy);

For SendMessage case in mouse button down I’ve set Capture = true. Then in mouse button up event the Capture is set to false. And actual target window is found through P/Invoke.

[DllImport("user32.dll")]
private static extern bool ScreenToClient(IntPtr hWnd, ref SeqPoint pt);
[DllImport("user32.dll")]
private static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(SeqPoint pt);        
[DllImport("user32.dll")]
private static extern IntPtr 
   RealChildWindowFromPoint(IntPtr hWndParent, SeqPoint Point);

The actual code to find the target window:

private IntPtr FindTargetWindow(Point pt)
{
  SeqPoint seqpt = new SeqPoint();
  seqpt.x = pt.X;
  seqpt.y = pt.Y;
  IntPtr hWnd = WindowFromPoint(seqpt);

  
  if(Bounds.Contains(pt))
    return this.Handle;

  if (hWnd.ToInt64() != 0)
  {
    IntPtr hParent = GetParent(hWnd);
    if(hParent.ToInt64() != 0 && 
        ScreenToClient(hParent, ref seqpt))
    {
      hParent = RealChildWindowFromPoint(hParent, seqpt);
      if(hParent.ToInt64() != 0)
        hWnd = hParent;
    }
  }
  return hWnd;
}

When selecting the target window, there is a selection frame drawn for the target window. This is accomplished as follows:

[DllImport("gdi32.dll")]
private static extern int GetBkColor(IntPtr hdc);
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out SeqRect rect);

private void FrameTargetWnd()
{
  Point pt = Cursor.Position;
  IntPtr hWnd = FindTargetWindow(pt);
  if(hWnd.ToInt64() != 0)
  {
    SeqRect rc;
    if(GetWindowRect(hWnd, out rc))
    {
      Rectangle rect = new Rectangle(rc.left, 
         rc.top, rc.right - rc.left, rc.bottom - rc.top);
      if(rect != previousRect)
      {
        Graphics g = Graphics.FromHwnd(hWnd);
        IntPtr hDC = g.GetHdc();
        if(hDC.ToInt64() != 0)
        {
          try
          {
            if(previousRect.Height > 0 
                  || previousRect.Width > 0)
              ControlPaint.DrawReversibleFrame(previousRect, 
                  drawFrameBkColorPrev, FrameStyle.Dashed);
            
            if(hWnd != this.Handle)
            {
              
              drawFrameBkColor = Color.FromArgb(GetBkColor(hDC));
              ControlPaint.DrawReversibleFrame(rect, 
                   drawFrameBkColor, FrameStyle.Dashed);
              
              
              
              previousRect = rect;
              drawFrameBkColorPrev = drawFrameBkColor;
            }
            else
            {
              
              
              
              previousRect.Size = new Size(0,0);
            }
          }
          finally
          {
            g.ReleaseHdc(hDC);
            g.Dispose();
          }
        }
      }
    }
  }
}

Everything else is just standard .NET stuff.

Disclaimer

THIS CODE AND INFORMATION IS PROVIDED ‘AS IS’ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.

History

  • 17th August, 2003: Initial post
  • 18th October, 2008: Download file updated

This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.

password-manager

Менеджер паролей на Python

Русский


Программа поддерживает большое количество пользователей. На данный момент список всех пользователей хранится в текстовом файле. Логины хранятся в открытом виде, а вместо паролей хранятся хеши. При этом хеш берется не от пароля а от конкатенации имени пользователя и пароля. Таким образом даже если пользователи имеют одинаковый пароль, хеши будут отличаться.
База данных паролей каждого пользователя хранится в отдельном текстовом файле. Эти файлы шифруются при помощи алгоритма AES. В качестве ключа для шифрования принимается хеш от пароля пользователя.

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

English


Program supports multi-user work. For now the list of users is stored in txt file. Usernames are stored uncovered and instead of passwords stores hashes, which are calculated using concatenation of username and password. So even if two users have similar password their hashes are different.
The passwords databases for each user is stored in separated files. This files are encrypted with AES. For the key takes the hash of user password.

For now I’m developing console interface but in future I’ll make GUI.

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

В этом уроке я покажу, как создать приложение менеджера паролей с помощью Cordova. Мы будем использовать jQuery Mobile для пользовательского интерфейса и CryptoJS для шифрования паролей.

Чтобы дать вам представление о том, над чем мы работаем, вот предварительный просмотр видео, а окончательный код можно найти на GitHub здесь .

http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2015/03/1427274572SitePoint_Password_Manager.mp4.mp4

начало

В стартовом шаблоне нам нужно включить jQuery , jQuery mobile и CryptoJS . Я не буду рассказывать об установке и создании приложения Cordova здесь, если вы еще этого не сделали, прочитайте руководство по началу работы . Дайте приложению подходящее имя и добавьте платформы, которые вы хотите поддерживать. Инструкции по сборке и запуску приложения вы найдете на той же странице. В этом учебном пособии мы используем плагин Cordova для уведомлений, вам нужно добавить его, чтобы найти инструкции здесь .

Внутри файла index.html добавьте следующие JavaScript и CSS:

 <style> @-ms-viewport { width: 100vw ; zoom: 100% ; } @viewport { width: 100vw ; zoom: 100% ; } @-ms-viewport { user-zoom: fixed ; } @viewport { user-zoom: fixed ; } </style> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css"> <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script> <script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 

Создание экрана доступа

Страница доступа будет первой страницей, отображаемой, когда пользователь открывает приложение. На странице доступа нам нужно отобразить форму для ввода пользователем мастер-пароля.

Вот код для экрана доступа, добавьте его в index.html внутри тегов body.

 <div data-role="page" id="pageone"> <div data-role="header"> <h1>Access</h1> </div> <div data-role="main" class="ui-content"> <p style="text-align: center">Enter Master Password</p> <input type="password" id="master_password" /> <a target="_blank" href="javascript:store_master_password()" style="text-decoration: none"><button>Submit</button></a> </div> </div> 

Если пользователь нажимает кнопку «Отправить», мастер-пароль сохраняется в переменной, чтобы впоследствии мы могли использовать его в качестве ключа для шифрования и дешифрования.

Вот код для функции store_master_password которая хранит главный пароль, добавьте его в js/index.js .

 var master_password = ""; $(document).on("pageshow","#pageone",function(){ master_password = ""; }); function store_master_password() { master_password = document.getElementById("master_password").value; if(master_password == "") { navigator.notification.alert("Please enter master password"); return; } $.mobile.changePage($("#pagetwo"), "slide", true, true); } 

После сохранения мастер-пароля мы перемещаем пользователя на домашнюю страницу (код ниже).

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

Вот как должен выглядеть экран доступа:

Начальный скриншот

Создание главного экрана

Пользователь попадает на домашнюю страницу после успешного сохранения мастер-пароля.

Многие люди до сих пор хранят данные для авторизации в бумажном виде. Очевидно, если кто-то украдёт ваш блокнот, то он получит доступ ко всем вашим аккаунтам — хуже не придумаешь. Ещё одна проблема — человеческий фактор, который не позволяет в полной мере придумывать действительно сложные пароли, которые нельзя будет взломать брут форсом или перебором по словарю. Пользователь seawarrior181 собрал аппаратный менеджер паролей, который решает эти проблемы. Данные всех аккаунтов хранятся внутри устройства, а встроенный генератор поможет создать пароль, который нельзя будет подобрать перебором слов.

Устройство называется PasswordPump. Оно может хранить в себе до 254 учётных записей (название учётной записи + логин + пароль). Данные хранятся на двух съёмных микросхемах памяти в зашифрованном виде, благодаря шифрованию военного уровня AES128.

При желании можно сделать бэкап в текстовый файл или на резервные микросхемы памяти (не зря они съёмные).

Аппаратный менеджер паролей — как он работает?

Это устройство подключается к ПК через USB кабель. Чтобы получить доступ к устройству (ко всем сохранённым аккаунтам в нём), нужно ввести мастер-пароль. После этого в списке вы должны выбрать нужную учётную запись, а на компьютере поставить курсор в форму ввода. Менеджер паролей сам введёт в ПК данные для авторизации.

Добавлять учётные записи в устройство можно нативно или через монитор последовательного порта на ПК.

Сборка устройства

PasswordPump базируется на плате Arduino Pro Micro. Единственный элемент ввода в устройстве — энкодер. Он позволяет считывать повороты ручки и нажатия на неё (прямо как в колёсике мышки). Информация выводится на небольшой OLED дисплей с разрешением 128×32 пикселей. Ещё понадобится RGB-светодиод (он будет показывать текущее состояние устройства), две микросхемы EEPROM-памяти, печатная плата и некоторый обвес. Вот все необходимые детали:

Все компоненты, необходимые для сборки

Вот так выглядит схема устройства и его прототип, собранный на макетной плате:

Схема сборки устройства на макетной плате

Устройство, собранное на макетной плате

Автор выбрал модель Arduino Micro, потому что она базируется на чипе ATmega32u4 с аппаратной поддержкой USB-соединения. Это значит, что микроконтроллер можно использовать как HID-устройство. В данном случае — это клавиатура. Устройство имитирует нажатие клавиш, тем самым вводя данные для авторизации.

Исходный код для микроконтроллера можно найти здесь.

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

Возможности менеджера паролей

Про базовые возможности уже было рассказано выше — в менеджере паролей можно защищённо хранить данные учётных записей и передавать их на ПК. Но это далеко не все возможности PasswordPump:

  • автоматическая очистка памяти и возврат к заводским настройкам после 10 неудачных попыток ввода мастер-пароля;
  • учётные данные шифруются с помощью AES128, а мастер-пароль хэшируется с помощью SHA256;
  • зашифрованные учётные записи и мастер-пароль посолены;
  • устройство не уязвимо для стандартных атак на пароли;
  • все данные учётных записей могут быть выгружены в текстовый документ для создания резервной копии в виде файла;
  • автоматическая блокировка устройства после 1 часа бездействия (нужно будет повторно ввести мастер-пароль);
  • генерация пароля из случайных букв, цифр и символов;
  • добавление учётных записей через монитор последовательного порта или на самом устройстве с помощью поворотного энкодера;
  • редактирование и удаление существующих учётных записей через ПК или само устройство;

Можно помочь автору в фиксе багов и добавлении новых возможностей в репозитории проекта.

Понравилась статья? Поделить с друзьями:
  • Мерзлячка как пишется правильно
  • Мерзлявая как пишется
  • Менеджер на английском языке как пишется
  • Менеджер английскими буквами как пишется
  • Мен или мэн как пишется правильно