Schlüsselbunde exportieren


23

Um zu einem Ubutun zu migrieren, möchte ich mein gesamtes Passwort exportieren, zum Beispiel in eine CSV-Datei.

In Keychain Access habe ich das Export-Menü gefunden, aber es ist immer deaktiviert, auch wenn der Zugriff entsperrt ist.

Was soll ich machen?


Siehe auch diese Frage / Antwort: apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

Antworten:


18

Das ist ungefähr so, wie ich es vor vielen Jahren gemacht habe. Dies ist das Skript-Update für Yosemite 10.11.5 - aber ich habe es nicht getestet.

  1. Ein Skript, das jedes Element im Schlüsselbund als Text speichert:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Ein zweites AppleScript-Element, das auf die Schaltfläche "Zulassen" klickt, die das erste Skript beim Lesen des Elements aus dem KeyChain auslöst.

    [Bearbeiten: Juli 2016] Dies wurde auf 10.11.5 aktualisiert, da einige gemeldet haben, dass sie ihren Mac mit der Verzögerung von 0,2 blockiert haben. Ich habe das Skript auf die Verarbeitung von jeweils nur 200 Ergebnissen beschränkt, wenn Sie also 1050 Schlüsselbundelemente haben Wenn Sie dieses Skript 6 Mal im ScriptEditor ausführen müssen, müssen Sie auch zulassen, dass der ScriptEditor im Abschnitt Eingabehilfen in den Sicherheitseinstellungen aktiviert ist:

    tell application "System Events"
        set maxAttemptsToClick to 200
        repeat while exists (processes where name is "SecurityAgent")
            if maxAttemptsToClick = 0 then exit repeat
            set maxAttemptsToClick to maxAttemptsToClick - 1
            tell process "SecurityAgent"
                try
                    click button 2 of window 1
                on error
                    keystroke " "
            end try
        end tell
        delay 0.2
      end repeat
    end tell
    

Dann hat das Link / Yosemite-Update oben auch einen Ruby-Konvertierungsschritt von der Textdatei zu CSV. Viel Glück!

ShreevatsaR weist in den Kommentaren darauf hin, dass diese Ruby-Konvertierung nur "Internet-Passwörter" und nicht "Anwendungs-Passwörter" abdeckt. Dies ist auf das Ziel des Skripts zurückzuführen, die "Internet-Passwörter" in die Anwendung zu exportieren 1Password.

Und hier ist eine Stapelüberlauf- Frage und Antwort in der gleichen Richtung

Die System.keychain ist hier:

security dump-keychain -d /Library/Keychains/System.keychain > systemkeychain.txt

Damit AppleScript mit dem Dialogfeld interagieren kann, muss auf der Registerkarte "Systemeinstellungen" -> "Sicherheits- und Datenschutzeinstellungen" -> "Datenschutz" für die Eingabehilfenoption "Script Editor.app" aktiviert sein Systemeinstellungen -> Sicherheits- und Datenschutzeinstellungen -> Registerkarte "Datenschutz", Option "Eingabehilfen" markiert


Vielen Dank! Es funktioniert gut. Ich weiß nur nicht, warum ich meine System.keychain nicht exportieren kann. Aber die meisten Schlüsselbunde gibt es auch auf login.keychain.
Maïeul

Informationen zum Update für diesen Schlüsselbund-Elementpfad finden Sie hier. Möglicherweise werden Sie jedoch nach Benutzername und Kennwort für jedes Element gefragt. Dies kann durch Ändern des Zulassungsskripts erfolgen.
MichaelStoner

Denkt nach. Ich habe keine Kompetenz in AppleScript. Ich habe nur wenige Passwörter in diesem Schlüsselbund, daher gebe ich mein Hauptpasswort oft ein.
Maïeul

Wenn Sie keine Ausgabe erhalten, führen Sie den Befehl im selben Verzeichnis wie der Schlüsselbund aus.
Rok Strniša

6
Das AppleScript hat unter OS X 10.10.3 Yosemite nicht funktioniert und behauptet, dass "Systemereignisse einen Fehler erhalten haben: Gruppe 1 von Fenster 1 des Prozesses" SecurityAgent "kann nicht abgerufen werden. Ungültiger Index".
Marcel Waldvogel

8

Ich habe ein Python-Skript geschrieben, das den Schlüsselbund-Dump in eine Excel-Datei konvertiert, und dachte, ich teile es mit Ihnen. Ich wähle Excel gegenüber CSV oder TSV, weil es von vielen Leuten installiert wird und nur durch einen Doppelklick auf die Datei funktioniert. Sie können das Skript natürlich ändern, um ein anderes Format zu drucken. Ich habe dies unter OS X 10.11 El Capitan getan, sollte aber auch unter älteren Betriebssystemen funktionieren.

  1. Da ich meine Passwörter nicht gerne im Klartext auf meiner Festplatte speichere, habe ich mit dem Festplatten-Dienstprogramm einen verschlüsselten Container erstellt. Öffnen Sie einfach das Festplatten-Dienstprogramm (drücken Sie cmd+ Space, geben Sie "disk" ein). Drücken Sie in der App cmd+ Nfür ein neues Bild, ändern Sie den Namen in SEC, ändern Sie die Verschlüsselung in 256-Bit AES und speichern Sie es unter SEC in einem Verzeichnis Ihrer Wahl. Hängen Sie dann das Volume ein, indem Sie auf die Datei doppelklicken (oder das Festplatten-Dienstprogramm verwenden).

  2. Erstellen Sie eine neue Datei mit dem Namen keychain.py im sicheren Container und fügen Sie den folgenden Code ein.

  3. Öffnen Sie nun Terminal.app und wechseln Sie in das gemountete verschlüsselte Volume: cd /Volumes/SEC

  4. Für die Installation des Excel-Moduls benötigen wir den Python-Paket-Manager (Sie werden zur Eingabe Ihres Passworts aufgefordert): sudo easy_install pip

  5. Wir müssen das Python Excel-Modul installieren: sudo pip install xlwt

  6. Exportieren Sie nun die Passwörter mit einer der anderen Antworten auf diese Frage. Ich habe es gerade getan security dump-keychain -d > keychain.txtund Spam hat auf die Schaltfläche Zulassen geklickt, während ich die Maus mit der anderen Hand gedrückt habe.

  7. Der letzte Schritt besteht darin, die txt-Datei mithilfe des Python-Skripts in ein lesbares Excel-Blatt zu konvertieren: python keychain.py keychain.txt keychain.xls

.

#!/usr/bin/env python

import sys
import os
import re
import xlwt

# Regex to match both generic and internet passwords from a keychain dump
regex = re.compile(
    r"""
    keychain:\s"(?P<kchn>[^"]+)"\n                  # absolute path and file of keychain
    version:\s(\d\d\d)\n                            # version
    class:\s"(?P<clss>(genp|inet))"\n               # generic password or internet password
    attributes:\n
    (\s*?0x00000007\s<blob>=(?P<name>[^\n]+)\n)?    # name
    (\s*?0x00000008\s<blob>=(?P<hex8>[^\n]+)\n)?    # ? only used at certificates
    (\s*?"acct"<blob>=(?P<acct>[^\n]+)\n)?          # account
    (\s*?"atyp"<blob>=(?P<atyp>[^\n]+)\n)?          # account type ("form"), sometimes int
    (\s*?"cdat"<timedate>=[^"]*(?P<cdat>[^\n]+)\n)? # datetime created
    (\s*?"crtr"<uint32>=(?P<crtr>[^\n]+)\n)?        # vendor key with four chars like "aapl"
    (\s*?"cusi"<sint32>=(?P<cusi>[^\n]+)\n)?        # ? always null
    (\s*?"desc"<blob>=(?P<desc>[^\n]+)\n)?          # description
    (\s*?"gena"<blob>=(?P<gena>[^\n]+)\n)?          # ? always null except one rare cases
    (\s*?"icmt"<blob>=(?P<icmt>[^\n]+)\n)?          # ? some sort of description
    (\s*?"invi"<sint32>=(?P<invi>[^\n]+)\n)?        # ? always null
    (\s*?"mdat"<timedate>=[^"]*(?P<mdat>[^\n]+)\n)? # datetime last modified
    (\s*?"nega"<sint32>=(?P<nega>[^\n]+)\n)?        # ? always null
    (\s*?"path"<blob>=(?P<path>[^\n]+)\n)?          # path
    (\s*?"port"<uint32>=(?P<port>[^\n]+)\n)?        # port number in hex
    (\s*?"prot"<blob>=(?P<prot>[^\n]+)\n)?          # ? always null
    (\s*?"ptcl"<uint32>=(?P<ptcl>[^\n]+)\n)?        # protocol but is blob ("http", "https")
    (\s*?"scrp"<sint32>=(?P<scrp>[^\n]+)\n)?        # ? always null except one rare cases
    (\s*?"sdmn"<blob>=(?P<sdmn>[^\n]+)\n)?          # used for htaccess AuthName
    (\s*?"srvr"<blob>=(?P<srvr>[^\n]+)\n)?          # server
    (\s*?"svce"<blob>=(?P<svce>[^\n]+)\n)?          # ? some sort of description
    (\s*?"type"<uint32>=(?P<type>[^\n]+)\n)?        # some blob: "iprf", "note"
    data:\n
    "(?P<data>[^"]*)"                               # password
    """, re.MULTILINE | re.VERBOSE)

# Dictionary used by the clean function (Apple is not always right about the
# types of the field)
field2type = { 
    "name": "blob",
    "hex8": "blob",
    "acct": "blob",
    "atyp": "simple",
    "cdat": "timedate",
    "crtr": "uint32",
    "cusi": "sint32",
    "desc": "blob", 
    "gena": "blob",
    "icmt": "blob",
    "invi": "sint32",
    "mdat": "timedate",
    "nega": "sint32",
    "path": "blob",
    "port": "uint32",
    "prot": "blob",
    "ptcl": "blob",
    "scrp": "sint32",
    "sdmn": "blob",
    "srvr": "blob", 
    "svce": "blob",
    "type": "blob",
    "data": "simple",
    "kchn": "simple",
    "clss": "simple"
}

def clean(field, match):
    value = match.group(field)
    if not value or value == "<NULL>":
        # print null values as empty strings
        return ""
    if field2type[field] == "blob":
        # strip " at beginning and end
        return value[1:-1]
    elif field2type[field] == "timedate":
        # convert timedate to the iso standard
        value = value[1:-1]
        return value[0:4] + "-" + value[4:6] + "-" + value[6:8] + "T" + \
            value[8:10] + ":" + value[10:12] + ":" + value[12:14] + "Z" + value[16:19]
    elif field2type[field] == "uint32":
        # if it really is a hex int, convert it to decimal
        value = value.strip()
        if re.match("^0x[0-9a-fA-F]+$", value):
            return int(value, 16)
        else:
            return value
    else:
        # do nothing, just print it as it is
        return value

def print_help():
    print "Usage: python keychain.py INPUTFILE OUTPUTFILE"
    print "Example: python keychain.py keychain.txt keychain.xls"
    print "  where keychain.txt was created by `security dump-keychain -d > keychain.txt`"
    print "  When dumping the keychain, you have to click 'Allow' for each entry in your"
    print "  keychain. Position you mouse over the button and go clicking like crazy."




print "Keychain 0.1: convert an Apple Keychain dump to an Excel (XLS) spreadsheet."

# Check for correct parameters
if len(sys.argv) != 3:
    print_help()
    sys.exit(1)
elif len(sys.argv) == 3:
    if not os.path.isfile(sys.argv[1]):
        print "Error: no such file '{0}'".format(sys.argv[1])
        print_help()
        exit(1)

# Read keychain file
buffer = open(sys.argv[1], "r").read()
print "Read {0} bytes from '{1}'".format(len(buffer), sys.argv[1])

# Create excel workbook and header
wb = xlwt.Workbook()
ws = wb.add_sheet("Keychain")
ws.write(0, 0, "Name")
ws.write(0, 1, "Account")
ws.write(0, 2, "Password")
ws.write(0, 3, "Protocol")
ws.write(0, 4, "Server")
ws.write(0, 5, "Port")
ws.write(0, 6, "Path")
ws.write(0, 7, "Description")
ws.write(0, 8, "Created")
ws.write(0, 9, "Modified")
ws.write(0, 10, "AuthName")
ws.write(0, 11, "AccountType")
ws.write(0, 12, "Type")
ws.write(0, 13, "Keychain")

# Find passwords and add them to the excel spreadsheet
i = 1
for match in regex.finditer(buffer):
    ws.write(i, 0, clean("name", match))
    ws.write(i, 1, clean("acct", match))
    ws.write(i, 2, clean("data", match))
    ws.write(i, 3, clean("ptcl", match))
    ws.write(i, 4, clean("srvr", match))
    ws.write(i, 5, clean("port", match))
    ws.write(i, 6, clean("path", match))
    ws.write(i, 7, clean("desc", match))
    ws.write(i, 8, clean("cdat", match))
    ws.write(i, 9, clean("mdat", match))
    ws.write(i, 10, clean("sdmn", match))
    ws.write(i, 11, clean("atyp", match))
    ws.write(i, 12, clean("clss", match))
    ws.write(i, 13, clean("kchn", match))
    i += 1
wb.save(sys.argv[2])

print "Saved {0} passwords to '{1}'".format(i-1, sys.argv[2])

Wow, das sieht wirklich gründlich aus. Ich werde es versuchen, obwohl ich noch eine Lösung für die sicheren Notizen und App-Passwörter brauche ... :( Dies sollte mir allerdings einen langen Weg bringen.
hepcat72


Jetzt muss ich nur noch herausfinden, wie ein Export einer RTFD erstellt wird, die ein eingebettetes Bild enthält. Ich habe ein paar Notizen mit Passwörtern in Großbuchstaben.
Hepcat72

Tolle Ergänzung dazu, plus eins und thx
ehime

5

Ab OSX 10.10.3 gibt es eine neue Methode zum automatischen Akzeptieren (Probleme sind während eines Upgrade-Pfads aufgetreten).

Bash-Funktionen (entweder .profileoder .bash_rcDateien hinzugefügt )

## At the terminal when you start getting the prompts, type `Accepts` and press enter
function Accepts () {
osascript <<EOF
  tell application "System Events"
    repeat while exists (processes where name is "SecurityAgent")
      tell process "SecurityAgent" to click button "Allow" of window 1
      delay 0.2
    end repeat
  end tell
EOF
}

## At the terminal when you start getting the prompts, type `Accepts YourUsername YourPassword` and press enter
function AcceptWithCreds () {
username="$1"
password="$2"

[ -z "${password}" ] && return 1

osascript 2>/dev/null <<EOF
    set appName to "${username}"
    set appPass to "${password}"
    tell application "System Events"
        repeat while exists (processes where name is "SecurityAgent")
            tell process "SecurityAgent"
                if exists (text field 1 of window 1) then
                    set value of text field 1 of window 1 to appName
                    set value of text field 2 of window 1 to appPass
                end if
            end tell
      tell process "SecurityAgent" to click button "Allow" of window 1
            delay 0.2
        end repeat
    end tell
EOF
echo 'Finished...'
}

Und verwenden Sie dieses Skript, um Ihren Schlüsselbund zu sichern ( sudo ./dump.sh)

#!/bin/bash
# Run above script in another window

security dump-keychain -d login.keychain > keychain-login.txt
security dump-keychain -d /Library/Keychains/System.keychain > keychain-system.txt

Das ist toll! Als ich es laufen ließ, erhielt ich execution error: System Events got an error: osascript is not allowed assistive access.an der Befehlszeile. Der einfachste Weg, dies zu lösen, bestand darin, den AppleScript-Code in die Script Editor-App einzufügen und von dort aus auszuführen.
Evan

AppleScripts funktionieren nicht am 10.10.5
oarfish 08.07.16

1
Das hat bei mir unter OS X El Capitan 10.11.6 geklappt. Stellen Sie sicher, dass Sie nicht das letzte Zeichen (Backtick) aus dem Skript kopieren. Der osascript is not allowed assistive accessFehler kann vermieden werden, indem Sie Ihre Terminal-App in den Systemeinstellungen => Sicherheit & Datenschutz => Barrierefreiheit zulassen.
Neon1

Auf Mojave funktioniert das nicht. AcceptWithCreds wird einfach beendet, ohne etwas zu tun.
oarfish vor

4

@ MichaelStoners Antwort ist ein guter Anfang, aber unter OS X 10.10.3 Yosemite schlägt sie fehl, da sein AppleScript-Code meldet System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Nachdem ich ein bisschen herumgespielt hatte, funktionierte die folgende Lösung für mich:

tell application "System Events"
    repeat while exists (processes where name is "SecurityAgent")
        tell process "SecurityAgent"
            keystroke " "
        end tell
        delay 1
    end repeat
end tell

Nachdem Sie dies gestartet haben, müssen Sie auf den "Zulassen" -Dialog klicken. Dieser Code wird eine Weile dauern, aber ich rate davon ab, die Verzögerung zu verringern ("Verzögerung 0.2" hat mich dazu gebracht, meinen Mac zwangsweise auszuschalten). Nimm einfach eine Tasse Kaffee.


1
Die Leertaste -> Tastenanschlag "" funktioniert nur, wenn Sie über Systemeinstellungen -> Tastatureinstellungen -> Registerkarte Verknüpfungen, untere Option "Vollständiger Tastaturzugriff" und dann "Alle Steuerelemente"
MichaelStoner

3

Die Schlüsselbund-Exportfunktion gilt für ITEMS und nicht für den gesamten Schlüsselbund. Außerdem können Sie die meisten Elemente nicht exportieren. In diesem Fall wird die abgeblendete Exportfunktion angezeigt.

Verwenden Sie die Migration Assistant- App, um den Schlüsselbund von einem Mac auf einen anderen zu kopieren .

Sie können dies auch manuell tun, indem Sie die Schlüsselbunddatei kopieren, die sich im Ordner ~ / Library / Keychains / befindet.

Öffnen Sie die Keychain Access- App auf einem neuen Computer und wählen Sie File> Add Keychain….


1
danke, aber ich sagte "zu einem anderen Betriebssystem" ... ich möchte OS X verlassen ...
Maïeul

Vielen Dank für die Bearbeitung und Klarheit. Das andere Betriebssystem war irreführend. Also willst du es dann als Textdatei (CSV)?
Ruskes

1
Ja, eine CSV, während in
Ordnung

1

Die securityBinärdatei ruft Elemente aus dem Schlüsselbund über die Befehlszeile ab, sodass Sie das in Python ausführen können , um den Inhalt systematisch zu sichern. Es hängt wirklich davon ab, in welchem ​​Format die Daten gespeichert werden sollen und wie Sie sie in Zukunft verwenden werden.

Kopieren / Einfügen ist auch eine gute Option, wenn Sie wissen, wie lange Sie eine neue Lösung implementieren möchten und ob Sie ein vorhandenes Programm oder eine vorhandene Bibliothek suchen müssen, um den Inhalt in das von Ihnen gewählte Format zu kopieren.

Das Menü für den Export von Elementen ist für den Export von öffentlichen und / oder privaten Schlüsseln vorgesehen, für die es branchenübliche Dateiformate gibt, mit denen die Daten entsprechend verschlüsselt und geschützt werden können, wenn sie für den Austausch und den Transport im Dateisystem gespeichert werden. Diese Funktion ist in der Hilfe zum Schlüsselbundassistenten kurz dokumentiert.


Gibt es keinen anderen Weg als es zu schreiben? Ok, ich werde mich um diese Binärdatei kümmern, aber ... um so viele Grundbedürfnisse zu haben, nur um so etwas wie eine CSV zu haben ...
Maïeul

1
Wenn Sie Ihren Beitrag bearbeiten können, um anzugeben, welches neue Betriebssystem und welches Format Sie für cvs verwenden möchten, hätte ich möglicherweise weitere Ideen für Sie. Wie gefragt, ist es sehr vage ...
bmike

0

Es gibt ein Tool namens KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .

Zum stillen Extrahieren von Passphrase / Konto / Zahlung / Sicherer Hinweis / PublicKey / PrivateKey / SymmetricKey / Zertifikat usw. aus dem Schlüsselbund.


2
Sie sollten keine Links einfügen, bei denen ein Benutzer ein Konto erstellen muss, um Inhalte anzuzeigen. Es wäre besser, wenn Sie den Inhalt des Links umformulieren würden.
David Anderson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.