<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sokol</title>
    <description>The latest articles on DEV Community by Sokol (@alexsokol31337).</description>
    <link>https://dev.to/alexsokol31337</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3948434%2F330c369f-291e-4dac-a027-5b5bc7ddf765.png</url>
      <title>DEV Community: Sokol</title>
      <link>https://dev.to/alexsokol31337</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexsokol31337"/>
    <language>en</language>
    <item>
      <title>KeePass can't protect you from a stealer. So I built something that can.</title>
      <dc:creator>Sokol</dc:creator>
      <pubDate>Wed, 27 May 2026 15:04:13 +0000</pubDate>
      <link>https://dev.to/alexsokol31337/keepass-cant-protect-you-from-a-stealer-so-i-built-something-that-can-2n3l</link>
      <guid>https://dev.to/alexsokol31337/keepass-cant-protect-you-from-a-stealer-so-i-built-something-that-can-2n3l</guid>
      <description>&lt;h2&gt;
  
  
  I built a hardware password manager because KeePass doesn't actually protect you
&lt;/h2&gt;

&lt;p&gt;I'm a hobbyist developer. I work with sensitive data every day — accounts, crypto wallets, corporate systems, personal communications.&lt;/p&gt;

&lt;p&gt;One day I had an uncomfortable realization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem nobody talks about
&lt;/h2&gt;

&lt;p&gt;I was using KeePassXC. Strong master password, encrypted database, local-only. I thought I was doing everything right.&lt;/p&gt;

&lt;p&gt;Then I thought about what actually happens when I unlock my vault:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The encrypted database sits on disk — readable by any process with file access&lt;/li&gt;
&lt;li&gt;The decrypted copy lives in RAM — readable by any process with memory access&lt;/li&gt;
&lt;li&gt;The master password gets typed on a keyboard — interceptable by any keylogger&lt;/li&gt;
&lt;li&gt;All of this happens inside an OS shared with dozens of other running programs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;KeePass protects you from someone stealing your hard drive. It does not protect you from malware already running on your machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A stealer with a keylogger gets your master password when you type it, then grabs the database file. Game over. And you'll never know it happened.&lt;/p&gt;

&lt;p&gt;The same is true for Bitwarden, 1Password, and every other software password manager. They're all prisoners of the OS they run on.&lt;/p&gt;

&lt;p&gt;Cloud managers add another layer: you're now trusting a third-party server and its breach history.&lt;/p&gt;

&lt;p&gt;Hardware keys like YubiKey solve part of the problem (2FA), but they don't replace a full offline password manager. They still require the target system to support their protocol.&lt;/p&gt;

&lt;p&gt;I wanted something different.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually wanted
&lt;/h2&gt;

&lt;p&gt;A device that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores passwords &lt;strong&gt;completely offline&lt;/strong&gt;, on hardware&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never transfers the database to the computer&lt;/strong&gt; — not even in encrypted form&lt;/li&gt;
&lt;li&gt;Simply &lt;strong&gt;types&lt;/strong&gt; the password like a keyboard (USB HID)&lt;/li&gt;
&lt;li&gt;Works on &lt;strong&gt;any OS&lt;/strong&gt; without installing software&lt;/li&gt;
&lt;li&gt;Has no moving parts, no battery, no cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Protokey
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxeqqtuaoslkebd2ad90.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxeqqtuaoslkebd2ad90.jpg" alt="Main view" width="799" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Protokey is a compact USB device built on a microcontroller that acts as a "smart keyboard with memory."&lt;/p&gt;

&lt;p&gt;You browse your vault on a 3.5" touchscreen → select an account → tap autofill → Protokey types your login, password, and Enter into whatever fi m,eld is focused. The computer sees only keystrokes. The database never leaves the device.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works technically
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fox1k8l2t86thi52sp4lq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fox1k8l2t86thi52sp4lq.jpg" alt="Passwords listing. Main page" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Panlee SC01 — 3.5" capacitive touchscreen (320×480), SD card slot, ESP32 microcontroller&lt;/li&gt;
&lt;li&gt;Arduino with ATmega32u4 — handles USB HID pairing with the host computer&lt;/li&gt;
&lt;li&gt;No physical buttons, no battery, no external power required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;![Inside the device]d(&lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d87jmgqxiikbntoyw92s.jpg" rel="noopener noreferrer"&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d87jmgqxiikbntoyw92s.jpg&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firmware &amp;amp; encryption:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firmware, flash memory, bootloader, and user data are all encrypted&lt;/li&gt;
&lt;li&gt;Master password stays in your head; derived key unlocks your data on the flash&lt;/li&gt;
&lt;li&gt;Encryption keys for the firmware ship &lt;strong&gt;in the box with your device&lt;/strong&gt; — they belong to you from day one&lt;/li&gt;
&lt;li&gt;You can take full custody of your keys. If you want us to hold a copy for recovery, that's opt-in. If you want us to delete our copy, we will.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Unlike most hardware security products, we can't update your device without your explicit involvement. That's a feature, not a limitation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The vault
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frma6kc1zvswui3xk746l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frma6kc1zvswui3xk746l.jpg" alt="Add page" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each record supports up to 16 fields. Field types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;text / word&lt;/td&gt;
&lt;td&gt;plain text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;login / email / phone&lt;/td&gt;
&lt;td&gt;aggregation (fast search)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;secret&lt;/td&gt;
&lt;td&gt;hidden field with generator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOTP&lt;/td&gt;
&lt;td&gt;2FA time-based codes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tags&lt;/td&gt;
&lt;td&gt;comma-separated, filterable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autofill template&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{field_name}&lt;/code&gt;, &lt;code&gt;{tab}&lt;/code&gt;, &lt;code&gt;{enter}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8937iwuwhg1zxewo2agw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8937iwuwhg1zxewo2agw.jpg" alt="Field types" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The autofill template is the key feature. You define exactly what gets typed and in what order. Works for single-field logins, multi-step forms, desktop apps, terminal prompts — anything that accepts keyboard input.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfoh5ty49oyiuymvkzup.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfoh5ty49oyiuymvkzup.jpg" alt="Filter by record type. WiFi for exmple." width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search and filtering happen in real time across visible fields, tags, and aggregation fields. Deep search (across all hidden fields) takes up to 3 minutes on 10,000 records — worth it when you need it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyxadb1gntnmhkqjohd2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyxadb1gntnmhkqjohd2.jpg" alt="Aggregation by name" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1ytn8ttutnomhl30pni.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1ytn8ttutnomhl30pni.jpg" alt="Aggregation by name listing" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsnoy3ajn5rzg1fqtlstl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsnoy3ajn5rzg1fqtlstl.jpg" alt="Aggregation" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Web interface
&lt;/h2&gt;

&lt;p&gt;WiFi is used exclusively for device administration — never for password transmission.&lt;/p&gt;

&lt;p&gt;Connect Protokey to your local network → access the web panel (HTTPS) to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and edit records&lt;/li&gt;
&lt;li&gt;Import/export backups&lt;/li&gt;
&lt;li&gt;Update firmware&lt;/li&gt;
&lt;li&gt;Manage TOTP entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w3jp942okfea7pkunak.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w3jp942okfea7pkunak.jpg" alt="Settings page" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The WiFi credential setup and web panel access are done from the device's settings menu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Physical threat protection
&lt;/h2&gt;

&lt;p&gt;This one I'm quietly proud of.&lt;/p&gt;

&lt;p&gt;Protokey has a duress system built into the PIN settings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Second PIN&lt;/strong&gt; — differs from your real PIN by one character. When entered, it switches the device into "panic mode": only shows records tagged with a specific decoy tag, sets the second PIN as the new primary, and wipes all duress settings — so there's no evidence a second PIN ever existed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blank password entry&lt;/strong&gt; — by default, the device accepts any input at the unlock screen. You can require a specific master password, or leave it open and rely on PIN only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wipe after N attempts&lt;/strong&gt; — standard brute-force protection.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: if someone demands access to your device, you hand them a plausible decoy vault. Your real records are in a hidden layer. The device shows no signs of having one.&lt;/p&gt;

&lt;p&gt;Restoring from that state requires a backup. Keep one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Working MVP assembled from components ordered locally (Ozon)&lt;/li&gt;
&lt;li&gt;✅ 3D-printed enclosure — 2cm thick, 3.5" wide, very light&lt;/li&gt;
&lt;li&gt;✅ Full password manager on 10,000 records&lt;/li&gt;
&lt;li&gt;✅ Autofill, TOTP, search, filters, web interface, duress protection&lt;/li&gt;
&lt;li&gt;🔜 Small production run of 100–200 units planned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Price: ~$270 (open to discussion for early adopters).&lt;/p&gt;

&lt;p&gt;Source code: currently closed. Open to discussing this with the community.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I'm posting this
&lt;/h2&gt;

&lt;p&gt;I built Protokey because I wanted it for myself. Now I want to know if others feel the same way.&lt;/p&gt;

&lt;p&gt;A few questions for you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do you store passwords today, and what's your biggest concern about it?&lt;/li&gt;
&lt;li&gt;What's missing from current password managers?&lt;/li&gt;
&lt;li&gt;Would you use a device like this?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're interested in following development — I'm setting up a Telegram channel.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Protokey — your passwords under your physical control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Telegram: &lt;a href="https://t.me/+-PpaF-4qGHNkZmY6" rel="noopener noreferrer"&gt;https://t.me/+-PpaF-4qGHNkZmY6&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>privacy</category>
      <category>devjournal</category>
      <category>arduino</category>
    </item>
  </channel>
</rss>
