Esporta portachiavi


Risposte:


18

Questo è esattamente come l' ho fatto molti anni fa, questo è l'aggiornamento dello script per Yosemite 10.11.5 - ma non l'ho testato.

  1. Uno script che salva ogni elemento nel Portachiavi in ​​testo:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Un secondo elemento AppleScript che fa clic sul pulsante "Consenti" attivato dal primo script durante la lettura dell'elemento dal KeyChain.

    [Modifica: luglio 2016] Questo è stato aggiornato alla nota 10.11.5 poiché alcuni hanno riferito di bloccare il loro Mac con il ritardo 0,2, ho limitato lo script per elaborare solo 200 risultati alla volta, quindi se hai 1050 elementi portachiavi , dovrai eseguire questo script 6 volte in ScriptEditor, inoltre dovrai consentire a ScriptEditor di essere abilitato nella sezione Accessibilità nelle preferenze di sicurezza in:

    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
    

Quindi l' aggiornamento del link / yosemite sopra ha anche un passaggio di conversione rubino dal file di testo in CSV, buona fortuna!

ShreevatsaR sottolinea nei commenti che questa conversione ruby ​​copre solo "password di Internet" e non "password di applicazioni". Ciò è dovuto allo scopo dello script di esportare le "password Internet" nell'applicazione 1Password.

Ed ecco una domanda di overflow dello stack e una risposta sulla stessa linea

System.keychain è qui:

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

Per consentire ad AppleScript di interagire con la finestra di dialogo Preferenze di Sistema -> Preferenze di Sicurezza e Privacy -> Scheda Privacy, l'opzione Accessibilità deve avere "Script Editor.app" abilitato Preferenze di Sistema -> Preferenze di Sicurezza e Privacy -> Scheda Privacy, Opzione di accessibilità evidenziata


grazie mille! Funziona benissimo. Non so perché non riesco a esportare il mio System.keychain. Ma la maggior parte dei portachiavi ci sono anche su login.keychain.
Maïeul,

Vedi l'aggiornamento per quel percorso dell'elemento portachiavi, ma potrebbe richiedere nome utente e password per ciascun elemento, che può essere lo script Consenti può essere modificato per fornire.
MichaelStoner,

Pensa. Non ho alcuna competenza in AppleScript. Ho poche password juste in questo portachiavi, quindi scriverò la mia password principale molte volte.
Maïeul,

Se non ottieni alcun output, prova a eseguire il comando nella stessa directory del portachiavi.
Rok Strniša,

6
AppleScript non ha funzionato per me su OS X 10.10.3 Yosemite, affermando che "Eventi di sistema ha avuto un errore: Impossibile ottenere il gruppo 1 della finestra 1 del processo \" SecurityAgent \ ". Indice non valido".
Marcel Waldvogel,

8

Ho scritto uno script Python che converte il dump del portachiavi in ​​un file Excel e ho pensato di condividerlo con te. Scelgo Excel su CSV o TSV perché molte persone lo hanno installato e funziona semplicemente facendo doppio clic sul file. Ovviamente puoi modificare lo script per stampare qualsiasi altro formato. L'ho fatto su OS X 10.11 El Capitan, ma dovrebbe funzionare anche su sistemi operativi più vecchi.

  1. Dal momento che non mi piace memorizzare le mie password in chiaro sul mio disco rigido, ho creato un contenitore crittografato utilizzando l'app Utility Disco. Apri Utility Disco (premi cmd+ Space, digita "disco"). Nell'app, premi cmd+ Nper una nuova immagine, modifica il nome in SEC, modifica la crittografia in AES a 256 bit e salvala in SEC in una directory a tua scelta. Quindi montare il volume facendo doppio clic sul file (o usando Utility Disco).

  2. Crea un nuovo file chiamato keychain.py nel contenitore sicuro e incolla il codice qui sotto.

  3. Ora apri Terminal.app e modifica la directory nel volume crittografato montato: cd /Volumes/SEC

  4. Abbiamo bisogno del gestore pacchetti python per l'installazione del modulo Excel (ti verrà richiesta la password): sudo easy_install pip

  5. Dobbiamo installare il modulo Python Excel: sudo pip install xlwt

  6. Ora esporta le password usando una delle altre risposte a questa domanda. L'ho appena fatto security dump-keychain -d > keychain.txte lo spam ha fatto clic sul pulsante Consenti mentre tenevo il mouse con l'altra mano.

  7. L'ultimo passo è convertire il file txt in un foglio Excel leggibile usando lo script python: 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, sembra davvero completo. Ho intenzione di
provarlo

Ho trovato questo eccellente break-down di note sicure: stackoverflow.com/questions/22370552/...
hepcat72

Ora ho solo bisogno di capire come creare un'esportazione di un RTF che includa un'immagine incorporata. Ho alcune note con le password in maiuscole.
hepcat72,

Incredibile aggiunta a questo, più uno e grazie
ehime

5

A partire da OSX 10.10.3 c'è un nuovo modo di accettare automaticamente (ho riscontrato problemi durante un percorso di aggiornamento)

Funzioni Bash (aggiunte a uno .profileo a .bash_rcfile)

## 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...'
}

E usa questo script per scaricare il tuo portachiavi ( 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

Questo è fantastico! Quando l'ho eseguito sono arrivato execution error: System Events got an error: osascript is not allowed assistive access.alla riga di comando. Il modo più semplice che ho trovato per gestirlo è stato incollare il codice AppleScript nell'app Script Editor ed eseguirlo da lì.
Evan,

AppleScripts non funziona il 10.10.5
oarfish

1
Questo ha funzionato per me con OS X El Capitan 10.11.6. Assicurati di non copiare l'ultimo carattere (backtick) dallo script. L' osascript is not allowed assistive accesserrore può essere evitato autorizzando l'app Terminale in Preferenze di Sistema => Sicurezza e Privacy => Accessibilità.
neon1

Questo non funziona su Mojave. AcceptWithCreds termina semplicemente, senza fare nulla.
Remo

4

@La risposta di MichaelStoner è un buon inizio, ma non riesce su OS X 10.10.3 Yosemite, con i suoi rapporti sul codice AppleScript System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Dopo aver giocato un po ', la seguente soluzione ha funzionato per me:

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

Dovrai fare clic sulla finestra di dialogo "Consenti" dopo aver avviato questo. Questo codice richiederà un po 'di tempo, ma sconsiglio di ridurre il ritardo ("ritardo 0.2" mi ha fatto forzare lo spegnimento del mio Mac). Prendi una tazza di caffè.


1
Lo spazio -> sequenza di tasti "" funziona solo se si dispone di Preferenze di Sistema -> Preferenze tastiera -> Scheda Scorciatoie, opzione in basso "Accesso tastiera completo" e quindi selezionato "Tutti i controlli"
MichaelStoner,

3

La funzione di esportazione del portachiavi è per ELEMENTI, non per l'intero portachiavi. Inoltre non ti consentirà di esportare la maggior parte degli articoli, ovvero quando vedrai la funzione Esporta in grigio.

Per copiare il portachiavi da un mac a un altro usa l' app Migration Assistant .

Oppure fallo manualmente copiando il file della catena chiave situato nella cartella ~ / Library / Keychains /.

Apri l' app Accesso Portachiavi sul nuovo computer e scegli File> Add Keychain….


1
grazie, ma ho detto "a un altro sistema operativo" ... voglio lasciare OS X ...
Maïeul

Grazie per la modifica e la chiarezza. L'altro sistema operativo era fuorviante. Quindi lo vuoi come file di testo allora (CSV)?
Ruskes,

1
sì, un CSV mentre sii ok ...
Maïeul

1

Il securitybinario recupererà gli elementi dal portachiavi dalla riga di comando, quindi potresti scriverlo in Python per scaricare sistematicamente il contenuto. Dipende davvero dal formato desiderato per i dati e dal modo in cui li utilizzerai in futuro.

Copia / incolla è anche un'opzione decente se sai per quanto tempo ti interessa implementare una nuova soluzione e se devi imparare / cercare un programma o una libreria esistente che scaricherà i contenuti nel formato scelto.

Il menu delle voci di esportazione è per l'esportazione di chiavi pubbliche e / o private per le quali esistono formati di file standard del settore per codificare e proteggere i dati, se del caso, memorizzati nel file system per lo scambio e il trasporto. Tale funzione è brevemente documentata nella guida di Keychain Assistant.


Non c'è altro modo che copiarlo? Ok, guarderò a questo binario, ma ... un bisogno fondamentale, solo per avere qualcosa come un CSV ...
Maïeul

1
Se riesci a modificare il tuo post per specificare quale nuovo sistema operativo e che cvs è un formato che ti piace, avrei probabilmente qualche idea in più per te. Come chiesto, è molto vago ...
bmike

0

C'è una chiamata dello strumento KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .

Per estrarre Passphrase / Account / Pagamento / Nota sicura / PublicKey / PrivateKey / SymmetricKey / Certificate e così via dal Portachiavi in ​​silenzio.


2
Non è necessario inserire collegamenti che richiedono a un utente di creare un account per visualizzare il contenuto. Sarebbe meglio se riformassi il contenuto del link.
David Anderson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.