Eksportuj breloki

23

w celu migracji do Ubutun, chciałbym wyeksportować całe moje hasło, na przykład do pliku CSV.

W Keychain Access znalazłem menu eksportu, ale jest ono zawsze wyłączone, nawet gdy dostęp jest odblokowany.

Co powinienem zrobić?

Maïeul
źródło
Zobacz także to pytanie / odpowiedź: apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

Odpowiedzi:

18

Chodzi o to, jak to zrobiłem wiele lat temu, to jest aktualizacja skryptu dla Yosemite 10.11.5 - ale go nie przetestowałem.

  1. Skrypt zapisujący każdy element w pęku kluczy do tekstu:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Drugi element AppleScript, który klika przycisk „Zezwól”, który uruchamia pierwszy skrypt podczas odczytywania elementu z KeyChain.

    [Edycja: lipiec 2016 r.] Zostało to zaktualizowane do notatki 10.11.5, ponieważ niektórzy zgłosili blokowanie swojego komputera Mac z opóźnieniem 0,2, ograniczyłem skrypt do przetwarzania tylko 200 wyników na raz, więc jeśli masz 1050 elementów pęku kluczy , musisz uruchomić ten skrypt 6 razy w ScriptEditor, musisz także zezwolić na włączenie ScriptEditor w sekcji Dostępność w preferencjach bezpieczeństwa w:

    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
    

Następnie powyższa aktualizacja linku / yosemite zawiera również krok konwersji ruby ​​z pliku tekstowego do CSV, powodzenia!

ShreevatsaR wskazuje w komentarzach, że ta konwersja ruby ​​obejmuje tylko „hasła internetowe”, a nie „hasła aplikacji”. Wynika to z tego, że celem skryptu jest wyeksportowanie „haseł internetowych” do aplikacji 1Password.

A oto pytanie o przepełnienie stosu i odpowiedź na te same pytania

System.keychain jest tutaj:

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

Aby umożliwić AppleScript interakcję z oknem dialogowym Preferencje systemowe -> Preferencje bezpieczeństwa i prywatności -> Karta Prywatność, opcja dostępności musi mieć włączoną opcję „Script Editor.app” Preferencje systemowe -> Preferencje bezpieczeństwa i prywatności -> Karta Prywatność, podświetlona opcja dostępności

MichaelStoner
źródło
dziękuję bardzo! To działa dobrze. Po prostu nie wiem, dlaczego nie mogę wyeksportować mojego pliku System.keychain. Ale większość pęku kluczy znajduje się również na login.keychain.
Maïeul
Zobacz aktualizację ścieżki tego elementu pęku kluczy, ale może poprosić o nazwę użytkownika i hasło dla każdego elementu, którym może być skrypt Zezwól, który można zmodyfikować.
MichaelStoner,
Myśli. Nie mam kompetencji w AppleScript. Mam tylko kilka haseł w tym pęku kluczy, więc będę wpisywać moje hasło główne wiele razy.
Maïeul
Jeśli nie otrzymasz danych wyjściowych, spróbuj uruchomić komendę w tym samym katalogu, co pęku kluczy.
Rok Strniša
6
AppleScript nie działał dla mnie w systemie OS X 10.10.3 Yosemite, twierdząc, że „W zdarzeniach systemowych wystąpił błąd: nie można uzyskać grupy 1 okna 1 procesu \„ SecurityAgent \ ”. Niepoprawny indeks”.
Marcel Waldvogel
8

Napisałem skrypt Pythona, który konwertuje zrzut pęku kluczy do pliku Excela i pomyślałem, że podzielę się nim z tobą. Wybieram Excela zamiast CSV lub TSV, ponieważ wiele osób go zainstalowało i działa po prostu klikając dwukrotnie plik. Możesz oczywiście zmodyfikować skrypt, aby wydrukować dowolny inny format. Zrobiłem to na systemie OS X 10.11 El Capitan, ale powinno działać również na starszych systemach operacyjnych.

  1. Ponieważ nie lubię przechowywać tekstu hasła w postaci zwykłego tekstu na dysku twardym, utworzyłem zaszyfrowany kontener za pomocą aplikacji Disk Utility. Po prostu otwórz Narzędzie dyskowe (naciśnij cmd+ Space, wpisz „dysk”). W aplikacji naciśnij cmd+, Naby wyświetlić nowy obraz, zmień nazwę na SEC, zmień szyfrowanie na 256-bitowy AES i zapisz go pod SEC w wybranym katalogu. Następnie podłącz wolumin, klikając dwukrotnie plik (lub używając Narzędzia dyskowego).

  2. Utwórz nowy plik o nazwie keychain.py w bezpiecznym kontenerze i wklej poniższy kod.

  3. Teraz otwórz Terminal.app i zmień katalog na zamontowany zaszyfrowany wolumin: cd /Volumes/SEC

  4. Potrzebujemy menedżera pakietów python do zainstalowania modułu Excel (pojawi się monit o podanie hasła): sudo easy_install pip

  5. Musimy zainstalować moduł Python Excel: sudo pip install xlwt

  6. Teraz wyeksportuj hasła, używając jednej z pozostałych odpowiedzi na to pytanie. Właśnie to zrobiłem security dump-keychain -d > keychain.txti spam kliknąłem przycisk Zezwól, trzymając drugą rękę myszy.

  7. Ostatnim krokiem jest przekonwertowanie pliku txt na czytelny arkusz Excel za pomocą skryptu 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])
Valyron
źródło
Wow, wygląda to naprawdę dokładnie. Postaram się spróbować, ale wciąż potrzebuję rozwiązania dla bezpiecznych notatek i haseł do aplikacji ... :( To powinno dać mi długą drogę.
hepcat72
Znalazłem ten doskonały podział bezpiecznych notatek: stackoverflow.com/questions/22370552/…
hepcat72
Teraz muszę tylko dowiedzieć się, jak utworzyć eksport RTFD, który zawiera osadzony obraz. Mam kilka notatek z hasłami w wielkich literach.
hepcat72
Niesamowity dodatek do tego, plus jeden i dzięki
ehime
5

Począwszy od OSX 10.10.3 istnieje nowy sposób automatycznego akceptowania (napotkałem problemy podczas ścieżki aktualizacji)

Funkcje Bash (dodane do jednego .profilelub .bash_rcplików)

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

I użyj tego skryptu, aby zrzucić swój brelok ( 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
ehime
źródło
To jest świetne! Kiedy go uruchomiłem, znalazłem się execution error: System Events got an error: osascript is not allowed assistive access.w linii poleceń. Najłatwiejszym sposobem, aby sobie z tym poradzić, było wklejenie kodu AppleScript do aplikacji Script Editor i uruchomienie go stamtąd.
Evan
Skrypty AppleScript nie działają w dniu 10.10.5
Oarfish
1
Działa to dla mnie w systemie OS X El Capitan 10.11.6. Pamiętaj, aby nie kopiować ostatniego znaku (backtick) ze skryptu. osascript is not allowed assistive accessBłędów można uniknąć poprzez umożliwienie swoją aplikację Terminal w oknie Preferencje systemowe => Bezpieczeństwo i prywatność => Ułatwienia dostępu.
neon1 1
To nie działa w Mojave. AcceptWithCreds po prostu kończy, nie robiąc nic.
Oarfish
4

@ Odpowiedź MichaelStonera to dobry początek, ale zawodzi w OS X 10.10.3 Yosemite, z raportowaniem kodu AppleScript System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Po krótkiej zabawie zadziałało dla mnie następujące rozwiązanie:

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

Po uruchomieniu tej opcji będziesz musiał kliknąć okno dialogowe „Zezwalaj”. Ten kod zajmie trochę czasu, ale odradzam zmniejszanie opóźnienia („opóźnienie 0,2” zmusiło mnie do wyłączenia komputera Mac). Po prostu napij się kawy.

Marcel Waldvogel
źródło
1
Spacja -> naciśnięcie klawisza ”” działa tylko wtedy, gdy masz Preferencje systemowe -> Preferencje klawiatury -> zakładka Skróty, dolna opcja „Pełny dostęp z klawiatury”, a następnie wybrana „Wszystkie elementy sterujące”
MichaelStoner
3

Funkcja eksportu pęku kluczy dotyczy POZYCJI, a nie całego pęku kluczy. Nie pozwoli również na eksport większości przedmiotów - wtedy zobaczysz wyszarzoną funkcję eksportu.

Aby skopiować pęku kluczy z jednego komputera Mac na inny, użyj aplikacji Migration Assistant .

Lub zrób to ręcznie, kopiując plik łańcucha kluczy znajdujący się w folderze ~ / Library / Keychains /.

Otwórz aplikację Keychain Access na nowym komputerze i wybierz File> Add Keychain….

Ruskes
źródło
1
dzięki, ale powiedziałem „do innego systemu operacyjnego” ... Chcę opuścić OS X ...
Maïeul
Dzięki za edycję i przejrzystość. Drugi system operacyjny wprowadzał w błąd. Więc chcesz go jako plik tekstowy (CSV)?
Ruskes
1
tak, csv, podczas gdy być w porządku ...
Maïeul
1

Plik securitybinarny będzie pobierał elementy z pęku kluczy z wiersza poleceń, aby można było to zrobić w Pythonie, aby systematycznie zrzucać zawartość. To naprawdę zależy od tego, jaki format danych chcesz i jak będziesz ich używać w przyszłości.

Kopiuj / wklej to również przyzwoita opcja, jeśli wiesz, jak długo chcesz wdrożyć nowe rozwiązanie i czy musisz nauczyć się / wyszukać istniejący program lub bibliotekę, która zrzuci zawartość do wybranego formatu.

Menu pozycji eksportu służy do eksportu klucza publicznego i / lub prywatnego, dla którego istnieją standardowe w branży formaty plików do kodowania i ochrony danych odpowiednio, gdy są przechowywane w systemie plików w celu wymiany i transportu. Ta funkcja jest krótko udokumentowana w pomocy dla Keychain Assistant.

bmike
źródło
Nie ma innego sposobu niż skrypt? Ok,
przejrzę się
1
Jeśli możesz edytować swój post, aby określić, jaki nowy system operacyjny i że cvs jest formatem, który lubisz, prawdopodobnie miałbym dla ciebie więcej pomysłów. Jak zapytano, jest to bardzo niejasne ...
bmike
0

Istnieje wywołanie narzędzia KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .

Aby wyodrębnić hasło / konto / płatność / bezpieczną notatkę / klucz publiczny / klucz prywatny / klucz symetryczny / certyfikat i tak dalej z pęku kluczy w ciszy.

nieznany
źródło
2
Nie należy wstawiać linków, które wymagają utworzenia konta przez użytkownika w celu przeglądania treści. Byłoby lepiej, gdybyś sformułował treść linku.
David Anderson