1Password mit einem Kurzbefehl entsperren

Ich bin ein lang­jäh­ri­ger Nutzer des Passwort-Managers 1Password. Obwohl die Firma vor eini­ger Zeit beschlos­sen hat, ein Abo-Modell ein­zu­füh­ren und in die Cloud umzu­zie­hen, bin ich der Software treu geblie­ben. Allerdings habe ich ein sehr lan­ges, kom­ple­xes und schwer zu mer­ken­des Passwort als Master-Passwort für den Online-Zugang erstellt, um den Zugriff über die Cloud bes­ser abzu­si­chern.

Da ich mir die­ses lan­ge Passwort aber nicht mer­ken kann und 1Password mich — ins­be­son­de­re auf mei­nem alten iMac ohne TouchID — zur Eingabe zwingt, habe ich nach einer Lösung gesucht, die es mir ermög­licht, ein etwas leich­ter zu mer­ken­des Passwort lokal für die App zu ver­wen­den.

Der erster Ansatz

Mein ers­ter Ansatz war, das Passwort ver­schlüs­selt im Notizen-Programm auf dem Mac zu spei­chern. Bei Bedarf muss­te ich nur das Programm öff­nen, die Notiz suchen und mit einem ein­fa­che­ren Passwort ent­schlüs­seln. Dann wur­de das Passwort kopiert und in 1Password ein­ge­fügt.

Das funk­tio­nier­te, war aber etwas umständ­lich und am Ende gab es auch noch ein Problem zu lösen, da das Passwort nicht auto­ma­tisch aus dem Clipboard gelöscht wur­de, aber dazu spä­ter mehr.

Auf mei­nem Linux-Rechner habe ich bereits eine Lösung mit einer ver­schlüs­sel­ten Datei und einem klei­nen Skript für das Terminal ver­wen­det, um eine Datei zu ent­schlüs­seln, in der das Master-Passwort gespei­chert ist. Dieses wird nach der Entschlüsselung per Skript in das Clipbard kopiert und kann dann in 1Password ein­ge­fügt wer­den, um das Programm zu öff­nen. Die Skripte zum Verschlüsseln und Entschlüsseln woll­te ich für den Kurzfehl wie­der­ver­wen­den.

Schritt 1: Verschlüsselte Datei erstellen

Da das Verschlüsseln eines Textes durch­aus ein Vorgang ist, den man öfter benut­zen kann, habe ich zusam­men mit ChatGPT ein Shell-Skript erstellt, das nach dem Text und einem Passwort fragt, den Text dann ver­schlüs­selt und in einer Datei spei­chert, deren Pfad und Name beim Aufruf des Skripts ange­ge­ben wird.

Exkurs: Speichern und Ausführen von Shell-Skripten
Ich spei­che­re alle mei­ne per­sön­li­chen Shell-Skripte im Verzeichnis ~/bin oder in der lan­gen Schreibweise <strong>/Users/MeinMacUser/bin</strong>. In die­sem Fall mit dem Namen <strong>verschluesselt</strong>. Damit die Skripte bei der Eingabe im Terminal auch gefun­den und aus­ge­führt wer­den, habe ich die Datei ~/.zprofileum die Zeileexport <strong>PATH="/Users/MeinMacUser/bin:$PATH"</strong> ergänzt. Außerdem muss das Skript als aus­führ­ba­re Datei mar­kiert wer­den, dazu wird im Terminal <strong>chmod +x ~/bin/verschluesseln</strong> auf­ge­ru­fen. Danach ist es am ein­fachs­ten, das Terminalfenster zu schlie­ßen und ein neu­es zu öff­nen. Nun kann das Skript an belie­bi­ger Stelle z.B. so auf­ge­ru­fen wer­den:

<strong>verschluesseln ~/Dokumente/ganzgeheimpasswd.txt</strong>

Aber hier ist nun das Skript:

#!/bin/zsh

# Überprüfung, ob ein Dateiname als Argument übergeben wurde
if [ $# -eq 0 ]; then
    echo "Bitte geben Sie den Namen der Ausgabedatei als Argument an."
    exit 1
fi

# Der Dateiname wird vom ersten Argument genommen
output_file=$1

# Überprüfung, ob die Datei bereits existiert
if [ -f "$output_file" ]; then
    # Die Datei existiert bereits, frage nach Bestätigung zum Überschreiben
    echo "Die Datei '$output_file' existiert bereits."
    read -p "Möchten Sie die Datei überschreiben? (j/n): " antwort
    
    if [[ $antwort != "j" ]]; then
        echo "Vorgang abgebrochen."
        exit 1
    fi
fi

# Anzahl der Iterationen für PBKDF2
iterations=10000

# Abfrage des zu verschlüsselnden Strings
echo "Bitte geben Sie den zu verschlüsselnden String ein:"
read -r string

# Abfrage des Passworts, ohne es auf dem Bildschirm anzuzeigen
echo "Bitte geben Sie Ihr Passwort für die Verschlüsselung ein:"
read -s password

# Verschlüsselung des Strings und Speicherung in der Datei
echo -n $string | openssl enc -aes-256-cbc -a -salt -pass pass:$password -pbkdf2 -iter $iterations -out $output_file

# Optional: Bestätigungsnachricht
echo "Der String wurde verschlüsselt in '$output_file' gespeichert."

Da ich kein Verschlüsselungsexperte bin, habe ich eine kon­kur­rie­ren­de KI, näm­lich Bard von Google, gefragt, was sie vom ChatGPT Skript hält. Die Antwort war sehr aus­führ­lich und auf­schluss­reich, ich hof­fe Bard hat sich das nicht hal­lu­zi­niert 😉

Bards Antwort
Die von Ihnen ver­wen­de­te Verschlüsselung mit openssl enc -aes-256-cbc -a -salt -pass pass:$password -pbkdf2 -iter $iterations -out $output_file ist sehr sicher.

Die ein­zel­nen Parameter:

  • -aes-256-cbc: Verwendet den Advanced Encryption Standard (AES) mit einer Schlüssellänge von 256 Bit im Cipher Block Chaining (CBC) Modus. Dies ist ein sehr siche­rer Algorithmus, der von der National Security Agency (NSA) für die Verwendung in Top-Secret-Anwendungen zer­ti­fi­ziert wur­de.
  • -a: Aktiviert die Base64-Kodierung der Ausgabe. Dies ist nütz­lich, wenn die ver­schlüs­sel­ten Daten in einer Umgebung gespei­chert wer­den müs­sen, die kei­ne binä­ren Daten unter­stützt.
  • -salt: Verwendet einen zufäl­li­gen Saltwert, um die Verschlüsselung zu stär­ken. Der Saltwert wird mit dem Passwort kom­bi­niert, um einen ein­deu­ti­gen Schlüssel für die Verschlüsselung zu gene­rie­ren.
  • -pass pass:$password: Gibt das Passwort für die Verschlüsselung an. Das Passwort soll­te stark sein und aus min­des­tens 12 Zeichen bestehen, die eine Mischung aus Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen ent­hal­ten.
  • -pbkdf2: Verwendet den PBKDF2-Algorithmus (Password-Based Key Derivation Function 2) zur Passwort-Härtung. Dies erhöht die Sicherheit der Verschlüsselung, indem es den Aufwand für Angreifer erhöht, das Passwort zu erra­ten.
  • -iter $ite­ra­ti­ons: Gibt die Anzahl der Iterationen für den PBKDF2-Algorithmus an. Höhere Iterationszahlen erhö­hen die Sicherheit der Verschlüsselung, aber auch die Verarbeitungszeit.
  • -out $output_file: Gibt die Datei an, in der die ver­schlüs­sel­ten Daten gespei­chert wer­den sol­len.

Zusammenfassend lässt sich sagen, dass die von Ihnen ver­wen­de­te Verschlüsselung sehr sicher ist und den aktu­el­len Stand der Technik wider­spie­gelt.

Es ist jedoch wich­tig zu beach­ten, dass die Sicherheit der Verschlüsselung immer von der Stärke des Passworts abhängt. Verwenden Sie daher immer ein star­kes Passwort und bewah­ren Sie es sicher auf.

Schritt 2: Eingabe des Entschlüsselungskennworts

Die Datei mit dem ver­schlüs­sel­ten 1Password Master-Passwort ist nun erstellt und gespei­chert. Nun wer­den noch ein paar Komponenten für den Kurzbefehl benö­tigt. Die ers­te Komponente fragt das Passwort für die Entschlüsselung ab. Da 1Password kei­ne direk­ten Schnittstellen für AppleScript und Kurzbefehle bie­tet, muss­te ich einen ande­ren Weg wäh­len. Ich habe mich für AppleScript ent­schie­den, da ich nur so eine mas­kier­te Passworteingabe imple­men­tie­ren konn­te.
.
Für den Ablauf gehe ich davon aus, dass 1Passwort im Vordergrund steht und das Passwortfeld den Eingabefokus hat. Wenn nun die Tastenkombination zum Ausführen des Shortcuts gedrückt wird, ver­hält sich 1Passwort aus mei­ner Sicht selt­sam, denn der Eingabefokus bleibt im Eingabefeld von 1Passwort, obwohl sich das AppleScript-Fenster dar­über befin­det. Mein Workaround ist, dass das AppleScript zuerst den Finder in den Vordergrund bringt, dann den Dialog auf­ruft, wobei das Eingabefeld dann den Fokus hat und man sofort los­tip­pen kann. Nach der Passworteingabe über­gibt das AppleScript das Passwort für den nächs­ten Schritt.

Hier der AppleScript Code:

on run
	tell application "System Events"
		tell application process "Finder" to set frontmost to true
	end tell
	set theResponse to display dialog "Gib das Master-Passwort ein?" default answer "" buttons {"OK"} default button "OK" with hidden answer
	set theText to text returned of theResponse
	return theText
end run

Schritt 3: Entschlüsseln des Master-Passwortes

Für die Entschlüsselung des Master-Passwortes ver­wen­de ich wie­der ein Shell-Skript, wel­ches das zuvor ent­schlüs­sel­te Passwort als Parameter nimmt und in der Variablen password spei­chert. Damit das Passwort auch über­nom­men wird, muss in den Optionen der Aktion “Shell-Skript aus­füh­ren” die Option “Eingabe: AppleScript-Ergebnis” aus­ge­wählt sein, lei­der wird das Ergebnis der Auswahl bei mir im Control nicht ange­zeigt, was aber „nur” ein Darstellungsfehler ist. Außerdem muss die Option “Eingabe über­ge­ben: als Argumente” aus­ge­wählt sein. Nur dann kann das vom vor­he­ri­gen AppleScript ermit­tel­te Passwort als Parameter $1 an das Script über­ge­ben wer­den. Den Pfad zur ver­schlüs­sel­ten Datei habe ich in die­sem Skript fest codiert, da der Kurzbefehl nur für die­sen einen Zweck funk­tio­nie­ren soll.

Das Ergebnis, also das Master-Passwort von 1Password, wird mit dem Befehl <strong>echo "$result" | pbcopy</strong>, in das Clipboard geschrie­ben und kann von dort im nächs­ten Schritt genutzt wer­den.

#!/bin/zsh 

password=$1

# Dateiname der verschlüsselten Datei
encrypted_file="/Users/MeinMacUser/Documents/ganzgeheimespasswd.txt"

# Anzahl der Iterationen für PBKDF2
iterations=10000


# Entschlüsselung der Datei mit dem eingegebenen oder übergebenen Passwort und sicherer Schlüsselableitung
result=$(openssl enc -d -aes-256-cbc -a -in $encrypted_file -pass pass:$password -pbkdf2 -iter $iterations)

# Übergabe des Passwortes an das Clipboard
echo "$result" | pbcopy

Schritt 4: Master-Passwort an 1Password übergeben

Das Passwort in dem Clipboard muss nun im nächs­ten Schritt an 1Password über­ge­ben wer­den. Dazu muss 1Password zunächst wie­der in den Vordergrund gebracht wer­den, damit dann über ein Systemereignis das Passwort in das Eingabefeld von 1Password ein­ge­fügt wer­den kann. Wenn der ent­spre­chen­de Befehl aus­ge­führt ist, öff­net sich 1Password und eigent­lich wäre damit aller erle­digt. Aber befin­det sch das Master-Passwort immer noch im Clipboard und könn­te somit über­all mit ⌘V als Klartext ein­ge­setzt wer­den. Um das zu ver­hin­dern, lee­re ich am Ende des Skriptes die Zwischenablage mit der Zeile <strong>set clipboard to ""</strong>.

tell application "1Password"
	activate
	tell application "System Events" to keystroke (the clipboard as text)
	set the clipboard to ""
end tell

In mei­ner Umgebung habe ich aber noch einen wei­te­re Komponente hin­zu­zu­fü­gen, daher brau­che ich hier noch einen wei­te­ren Schritt.

Schritt 5: 1Password Master aus der Zwischenablage von Alfred.app löschen

Normalerweise wird ein Clipboard-Eintrag beim nächs­ten Kopieren gelöscht. Da ich aber Alfred.app als Clipboard-Manager ver­wen­de, wird das Master-Passwort in der History gespei­chert und muss auch dort gelöscht wer­den. Ich kann hier nur den Weg für den Alfred Clipboard-Manager beschrei­ben, wenn jemand ande­re Lösungen für ande­re Clipboard-Manager hat, neh­me ich die­se ger­ne auf.

Alfred bie­tet zwar die Möglichkeit, bestimm­te Anwendungen von der Clipboard History aus­zu­schlie­ßen, aber das woll­te ich nicht gene­rell für das Terminal. Ich brauch­te also eine ande­re Lösung.

Nach einer Suche im Alfred Forum fand ich den Hinweis, dass die Clipboard History in einer SQlight Datenbank <strong>/Users/MeinMacUser/Library/Application Support/Alfred/Databases/clipboard.alfdb</strong> gespei­chert wird. Nach eini­gen Interaktionen mit ChatGPT kann ich nun fol­gen­den Terminal-Befehl ver­wen­den, der den letz­ten Eintrag in die­ser Datenbank löscht. Dieses klei­ne Skript bil­det dann den Abschluss mei­nes Kurzbefehls.

sqlite3 "/Users/MeinMacUser/Library/Application Support/Alfred/Databases/clipboard.alfdb"  "DELETE FROM clipboard WHERE ROWID = (SELECT ROWID FROM clipboard ORDER BY ROWID DESC LIMIT 1);"

Exkurs: Alternative zum Löschen des letz­ten Eintrag
Falls man mal mehr Einträge löschen möch­te, dann kann man das auch über die Zeit machen, da alle Einträge mit eine Zeitstempel ver­se­hen sind. Der Zeitstempel besteht sind die Sekunden, die seid dem 01.01.2001 00:00 Uhr ver­gan­gen sind, was etwas komisch ist, da unter nor­ma­len Umständen die Sekunden seid dem 01.01.1970 00:00 Uhr zur Berechnung her­an­ge­zo­gen wer­den. So löscht der fol­gen­de Befehl alle Einträgem der letz­ten 5 Minuten:

sqlite3 clipboard.alfdb "DELETE FROM clipboard WHERE ts &gt; ((strftime('%s', 'now') - 978307200) - 300);"

Zum Anschauen der SQlight Datenbanken emp­feh­le ich das Tool: DB Browser for SQLite

Letzte Anmerkungen

Nun sind alle Komponenten für den Kurzbefehl vor­ge­stellt. Als letz­tes habe ich mir noch ein Tasturkürzel für die Ausführung in den Kurzbefehlen Details defi­niert. Er kann aber auch über das Kurzbefehl-Menu oder anders gestar­tet wer­den, ganz nach Wunsch.

Problem mit den Kurzbefehl Sicherheitseinstellungen

Ein klei­nes Problem kann aller­dings noch auf­tre­ten. Auf dem Mac, auf dem ich den Kurzbefehl erstellt habe, wur­de ich beim ers­ten Start natür­lich gefragt, ob der Kurzbefehl Zugriff auf AppleScript und die Shell haben darf. Was natür­lich erlaubt wer­den muss.

Ein zwei­ter Mac ver­wei­ger­te jedoch zunächst die Ausführung, da das Kurzbefehle-Programm angeb­lich(?) kei­ne Rechte zum Ausführen von Tastaturbefehlen hat­te. Normalerweise wird man beim ers­ten Ausführen eines Programms, das sol­che Rechte benö­tigt, gefragt, ob man dies zulas­sen möch­te und gege­be­nen­falls sogar an die Stelle gelei­tet, wo man die Berechtigung geben kann. Auf dem Mac war das aber nicht der Fall, er wei­ger­te sich ein­fach. Abhilfe habe ich nach län­ge­rem Ausprobieren schließ­lich dadurch geschaf­fen, dass ich im Kurzbefehl bei den Optionen die Datenschutz Einstellungen min­des­tens ein­mal zurück­ge­setzt habe, auch habe ich das Programm Kurzbefehle hän­disch in den Sicherheitseinstellungen von MacOS in den Optionen Eingabeüberwachung hin­zu­ge­fügt.

1Password und AppleScript

Die Besonderheit von 1Password im Zusammenhang mit AppleScript und dem Eingabefokus habe ich wei­ter oben schon erwähnt. Eine wei­te­re Besonderheit ist mir auf­ge­fal­len: 1Password lässt sich nicht wie ande­re Programme mit AppleScript star­ten.

tell application "1Password 
   activate
end tell 

Das obi­ge AppleScript bringt 1Password zwar in den Vordergrund, wenn es schön läuft, star­tet es aber nicht. Wenn mit dem Kurzbefehl auch 1Password gestar­tet wer­den soll, geht das aber mit der Kurzbefehl Aktion „App öff­nen”, die am bes­ten nach dem Script ein­ge­fügt wird, das das Master-Passwort ent­schlüs­selt hat.

Und wie immer…

… kann die Kommentarfunktion für Kritik, Anregungen, Verbesserungen und auch Lob genutzt wer­den.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert