Fingerprint Passwort Manager mit ATmega32U4 (Arduino Pro Micro) Emuliert eine USB HID Tastatur und führt Makros aus. So lassen sich beliebige Texte und Tastenkombinationen an den Rechner senden.
Für den Rechner sieht es so aus, als würde die Eingabe über USB Keyboard erfolgen.
Pro Fingerabdruck lässt sich eine Macro belegen. Nach dem berühren des Fingerprint Sensors und Erkennung des Fingerabdrucks wird dazugehörige Macro ausgeführt.
Es gibt auch die Möglichkeit die Zeitverzögerungen im Macro zu hinterlegen. Auf diese Weise kann die Reaktionszeit des Computers, z. B. bei öffnen der Programme, berücksichtigt werden.
Diese Passwort Manager ist, durch Emulation einer USB Tastatur auf der Hardwareebene, Betriebssystem unabhängig. Kein Eingriff in die Software nötig. Und kann mit Systemen verwendet werden, die durch Administrator voll gesperrt sind. Nur freie USB Port ist erforderlich.
Die Grundidee
Ein Freund macht Homeoffice und muss bei jedem Einschalten des Rechners ein aufwendiges Passwort eingeben. Beim Starten des Dienstprogramms wieder ein Passwort eingeben.
Dies zu automatisieren geht nicht, weil das ein Dienstrechner ist und da kann man nicht mal eine USB Flash einstecken, geschweige irgendwas an dem System zu ändern. Ich habe gesehen wie viel er dabei tippen muss. Aber eine zusätzliche Tastatur kann man da immer noch rein stöpseln.
Da habe ich sofort an meinen macro keyboard gedacht. Das Problem ist, dass bei einem Makro Keypad jeder auf den Button drücken kann und so das Passwort eingeben kann, oder auf dem Bildschirm sehen kann.
Dann kam die Idee das Makro Keypad Programm für resistiven touch Sensor mit einem Fingerabdrucksensor als Eingabegerät zu verwenden. Für jeden Finger kann man Passwörter und Makros hinterlegen. Also pro Person zehn Stück.
R503 Fingerabdrucksensor
Der Fingerabdruck-Scanner hat ordentliches Datenblatt und unterstützt die Steuerung des Leuchtrings.
PDF Datasheet R503 Kapazitive Fingerprint Sensor vom Hersteller GROW
Ich habe den R503 Sensor bei AliExpress (3C Vedio YB Store) für 13,67€ erworben. Das Gehäuse stammt von Pollin und hat die Bezeichnung: Kunststoffgehäuse, Kemo , G025N, 72x50x22 mm.
Schaltplan / Anschlussplan R503 Fingerprint und Arduino Pro Micro
Es scheinen alle kursierende Arduino Pro Micro Boards den falschen Spannungsregler zu haben. Bitte die Spannung nachmessen und den richtigen Spannungsregler MIC5219 einlöten. ATmega32U4 kann mit 5V arbeiten, Fingerabdrucksensoren allerdings nicht. Alternativ kann für den Fingerprint Modul ein separater 3,3V Spannungsregler verwendet werden. Die Datenleitungen sind 5V kompatibel und können direkt mit 5V-Version Arduino Board verbunden werden.
Funktionsprinzip
Zuerst müssen im Fingerabdrucksensor die Fingerabdrücke gespeichert werden. Jeder gespeicherte Fingerabdruck hat eine ID. Wenn der Fingerabdruck erkannt worden ist, sendet Fingerabdrucksensor die ID an Arduino. Arduino Leonardo (ATmega32U4 ) führt Makro, beim Empfang des IDs, aus und Sendet die Keycodes über USB an den Rechner.
Wegen der Sicherheitsgründen habe ich überlegt das Passwort Eingabe und das Speichern neuer Fingerabdrucke in zwei separaten Sketches durchzuführen.
Zuerst sollen mit dem Arduino Sketch “Fingerprint_Einlesen.ino” die Fingerprints gespeichert werden. Das Programm "Fingerprint Einlesen" kann Fingerprints einlesen, löschen und dem Fingerabdrucksensor ein Passwort vergeben. Das geht über den seriellen Terminal.
Fingerabdruck Registrieren "r"
Fingerabdruck Löschen "l"
Passwort für Fingerabdrucksensor setzen "p"
Danach können Texte, Passwörter und Macros angelegt werden. Die werden in der Datei "Fingerprint_USB__HID/Makros.h" als String Array abgelegt. Wobei Arreyposition ist das ID des Fingerabdruckes.
Der String kann Text und Steuerbefehle beinhalten.
Steuerbefehle haben Format "§xxxx ". § Zeichen - Start, Leerzeichen - Ende. Mit dem Befehlssatz können Sie beliebige Tastenkombinationen senden. Weitere Informationen finden Sie in der Kopfzeile des Sketches. Dann kann das eigentliche Password Sketch "Fingerprint_USB__HID" kompiliert und in das Arduino geladen werden.
Tipp: Ich verschlüssele die Datei "Makros.h" mit dem Programm AxCrypt, damit meine Passwörter verschlüsselt aufbewahrt werden.
Tipp: Programme ausführen geht über Tastenkombination "Windows+r", dann den Pfad für das Programm und Programm selbst, dann Enter, dann Zeitverzögerung, weitere eingaben.
Hier ein Beispiel das Öffnen einer bestimmter Webseite.
"§p0x87 r§r0x87 §t500 C:\\Program Files\\Mozilla Firefox\\firefox.exe https://esp8266-server.de/keypad.html\n"
Bitte beachten Sie, dass Backslash mit einem anderen Backslash maskiert werden soll.
Download Fingerprint Macro Key USB HID Arduino Projekt als ZIP
Fingerprint Macro Key USB HID auf GitHub
Benötigte Bibliothek: Adafruit Fingerprint Sensor Library (2.0.4)
Projekt Webseite Fingerprint Passwort Manager
Erste Version mit Fake ID809 (Spiegelverkerte Pinout und meldet sich als FPC1021A)
// Fingerabdruck Passwort Eingabe über USB HID Keyboard Emulator
// Fingerprint USB HID Keyboard
// USB Macro Keypad
// shortcuts key fingerprint
// https://esp8266-server.de/fingerprint.html
// Arduino Leonardo Micro + FPC1021A fingerprint ID809 oder R503
// Die Makros und Texte zum Fingerabdrucken befinden sich im "Makros.h"
// Bitte vorher das Sketch "Fingerprint_Einlesen.ino" laden und die Finger im Sensor registrieren.
#include <stdint.h>
#include <Adafruit_Fingerprint.h>
#include "KeyboardDE.h" // Spezielll für Deutsche Tastaturbelegung
#include "Makros.h" // Hier bitte die Makros und Passwörter hinterlegen
#define SensorPassword 0x00000000 // Fingerprint Password, falls gesetzt, hier eintragen (4Byte)
#define TouchSensor 2 // Pin für Fingererkennung
#define active_low 1 // 0- FPC1021A, 1- R503
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1,SensorPassword);
// ---------------- Setup ------------------------------------------
void setup(void)
{
Serial.begin(115200); // Kommunikation mit PC Statusmeldungen / Debug Ausgaben
finger.begin(57600); // Kommunikation mit Fingerabdrucksensor (57600 Baud ist Standard)
pinMode(TouchSensor, INPUT);
if (finger.verifyPassword())
{
if (Serial) Serial.println("Fingerabdrucksensor angeschlossen");
Keyboard.begin(); // Starte USB HID Tastatur Emulation
}
else // Fingerabdrucksensor antwortet nicht
{
while(!Serial) // Warte bis serielle Terminal gestartet wurde
Serial.println("Fingerabdrucksensor antwortet nicht");
while(1); // Programmausführung stoppen
}
}
void loop(void)
{
int FingerID = getFingerprintIDez(); // Erkennung starten
if ( FingerID > 0 )
{
KeyOutput(data[FingerID-1]); // Wenn erkannt, Keyboard Ausgabe des Strings aus dem Array auf der ID - Position
while (!(active_low ^ digitalRead(TouchSensor))); // hier bleiben bis neue Berührung
}
}
int getFingerprintIDez()
{
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE); // Fingerabdruck eingelesen
p = finger.image2Tz();
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE);
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerSearch();
if (p != FINGERPRINT_OK)
{
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE); // Fingerabdruck nicht im Datenbank
finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 500, FINGERPRINT_LED_RED);
return -1;
}
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE); // Fingerabdruck im Datenbank gefunden
finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 200, FINGERPRINT_LED_BLUE);
return finger.fingerID;
}
// ---------------- HEX String in Integer umwandeln -----------------------
unsigned int hexToDec(String hexString)
{
unsigned int decValue = 0;
int nextInt;
hexString.toUpperCase();
for (int i = 0; i < hexString.length(); i++)
{
nextInt = int(hexString.charAt(i));
if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
nextInt = constrain(nextInt, 0, 15);
decValue = (decValue * 16) + nextInt;
}
return decValue;
}
// ---------- Ausgabe des Textes über HID-Keyboard und Ausführung der Befehle -----
void KeyOutput(const String str)
{
int pos = str.indexOf('§');
while (pos >= 0)
{
if (pos > 0) Keyboard.print(str.substring(0, pos - 1));
str.remove(0, pos + 1);
char kode = str.charAt(0);
pos = str.indexOf(' ');
String Daten = str.substring(1, pos);
byte z;
switch (kode) // Befehle
{
case 'w':
z = hexToDec(Daten);
Keyboard.write(z);
break;
case 't':
delay(Daten.toInt());
break;
case 'p':
z = hexToDec(Daten);
Keyboard.press(z);
break;
case 'r':
z = hexToDec(Daten);
Keyboard.release(z);
break;
case 'a':
Keyboard.releaseAll();
break;
}
str.remove(0, pos + 1);
pos = str.indexOf('§');
}
if (str.length() > 0)Keyboard.print(str);
Display More