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ć?
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ć?
Odpowiedzi:
Chodzi o to, jak to zrobiłem wiele lat temu, to jest aktualizacja skryptu dla Yosemite 10.11.5 - ale go nie przetestowałem.
Skrypt zapisujący każdy element w pęku kluczy do tekstu:
security dump-keychain -d login.keychain > keychain.txt
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”
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.
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).
Utwórz nowy plik o nazwie keychain.py w bezpiecznym kontenerze i wklej poniższy kod.
Teraz otwórz Terminal.app i zmień katalog na zamontowany zaszyfrowany wolumin: cd /Volumes/SEC
Potrzebujemy menedżera pakietów python do zainstalowania modułu Excel (pojawi się monit o podanie hasła): sudo easy_install pip
Musimy zainstalować moduł Python Excel: sudo pip install xlwt
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.txt
i spam kliknąłem przycisk Zezwól, trzymając drugą rękę myszy.
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])
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 .profile
lub .bash_rc
plikó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
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.
osascript is not allowed assistive access
Błędów można uniknąć poprzez umożliwienie swoją aplikację Terminal w oknie Preferencje systemowe => Bezpieczeństwo i prywatność => Ułatwienia dostępu.
@ 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.
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…
.
Plik security
binarny 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.
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.