Ekspor gantungan kunci


Jawaban:


18

Ini hanya tentang bagaimana saya melakukannya bertahun-tahun yang lalu, ini adalah pembaruan skrip untuk Yosemite 10.11.5 - tapi saya belum mengujinya.

  1. Sebuah skrip yang menyimpan setiap item dalam Keychain ke teks:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Item AppleScript kedua yang mengklik tombol "Izinkan" yang dipicu skrip 1 saat membaca item dari KeyChain.

    [Sunting: Juli 2016] Ini telah diperbarui ke catatan 10.11.5 karena beberapa telah melaporkan mengunci Mac mereka dengan penundaan 0,2, saya telah membatasi skrip untuk hanya memproses 200 hasil sekaligus, jadi jika Anda memiliki 1050 item gantungan kunci , Anda harus menjalankan skrip ini 6 kali di ScriptEditor, Anda juga harus mengizinkan ScriptEditor diaktifkan di bagian Aksesibilitas di preferensi keamanan di:

    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
    

Kemudian pembaruan tautan / yosemite di atas juga memiliki langkah konversi ruby ​​dari file teks ke CSV, Selamat mencoba!

ShreevatsaR menunjukkan dalam komentar bahwa konversi ruby ​​ini hanya mencakup "kata sandi internet" dan bukan "kata sandi aplikasi". Ini karena tujuan dari skrip ini adalah untuk mengekspor "kata sandi internet" ke dalam aplikasi 1Password.

Dan inilah pertanyaan dan jawaban stack overflow di sepanjang baris yang sama

System.keychain ada di sini:

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

Untuk mengaktifkan AppleScript untuk berinteraksi dengan kotak dialog Preferensi Sistem -> Preferensi Keamanan & Privasi -> Tab Privasi, Opsi Aksesibilitas harus mengaktifkan "Script Editor.app" diaktifkan Preferensi Sistem -> Preferensi Keamanan & Privasi -> Tab Privasi, Opsi Aksesibilitas disorot


Terima kasih banyak! Ini bekerja dengan baik. Saya tidak tahu mengapa saya tidak bisa mengekspor System.keychain saya. Tetapi sebagian besar gantungan kunci ada juga di login.keychain.
Maïeul

Lihat pembaruan untuk jalur item gantungan kunci itu, tetapi mungkin meminta nama pengguna dan kata sandi untuk setiap item, yang mungkin merupakan skrip Izinkan yang dapat dimodifikasi untuk disediakan.
MichaelStoner

Berpikir. Saya tidak memiliki kompetensi di AppleScript. Saya punya beberapa kata sandi di gantungan kunci ini, jadi saya akan mengetik kata sandi utama saya berkali-kali.
Maïeul

Jika Anda tidak mendapatkan hasil, coba jalankan perintah di dalam direktori yang sama dengan gantungan kunci.
Rok Strniša

6
AppleScript tidak bekerja untuk saya di OS X 10.10.3 Yosemite, mengklaim "Sistem Kejadian mendapat kesalahan: Tidak bisa mendapatkan grup 1 dari jendela 1 proses \" SecurityAgent \ ". Indeks tidak valid".
Marcel Waldvogel

8

Saya menulis skrip python yang mengubah dump gantungan kunci ke file Excel dan berpikir saya membaginya dengan Anda. Saya memilih Excel daripada CSV atau TSV karena banyak orang menginstalnya dan hanya berfungsi dengan mengklik dua kali pada file. Tentu saja Anda dapat memodifikasi skrip untuk mencetak format lain. Saya melakukan ini pada OS X 10.11 El Capitan, tetapi harus bekerja pada OS yang lebih tua juga.

  1. Karena saya tidak suka menyimpan plaintext kata sandi di hard drive saya, saya membuat wadah terenkripsi menggunakan aplikasi Disk Utility. Cukup buka Disk Utility (tekan cmd+ Space, ketik "disk"). Di aplikasi, tekan cmd+ Nuntuk gambar baru, ubah nama menjadi SEC, ubah enkripsi ke 256-Bit AES dan simpan di bawah SEC di direktori pilihan Anda. Kemudian pasang volume dengan menggandakan klik pada file (atau menggunakan Disk Utility).

  2. Buat file baru bernama keychain.py di wadah aman dan tempel kode di bawah ini.

  3. Sekarang buka Terminal.app dan ubah direktori menjadi volume terenkripsi yang terpasang: cd /Volumes/SEC

  4. Kami membutuhkan manajer paket python untuk menginstal modul Excel (Anda akan diminta kata sandi Anda): sudo easy_install pip

  5. Kita perlu menginstal modul Python Excel: sudo pip install xlwt

  6. Sekarang ekspor kata sandi menggunakan salah satu jawaban lain untuk pertanyaan ini. Saya baru saja melakukannya security dump-keychain -d > keychain.txtdan mengklik spam pada tombol Allow sambil memegang mouse dengan tangan saya yang lain.

  7. Langkah terakhir adalah mengonversi file txt ke lembar Excel yang dapat dibaca menggunakan skrip 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, ini terlihat sangat menyeluruh. Saya akan mencobanya, meskipun saya masih membutuhkan solusi untuk catatan aman dan kata sandi aplikasi ... :( Ini seharusnya membuat saya jauh.
hepcat72


Sekarang saya hanya perlu mencari cara untuk membuat ekspor rtfd yang menyertakan gambar tertanam. Saya punya beberapa catatan dengan kata sandi di tutup layar.
hepcat72

Tambahan yang luar biasa untuk ini, ditambah satu dan
terima kasih

5

Pada OSX 10.10.3 ada cara baru untuk menerima otomatis (saya mengalami masalah selama jalur peningkatan)

Fungsi Bash (ditambahkan ke salah satu .profileatau .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...'
}

Dan gunakan skrip ini untuk membuang keyring Anda ( 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

Ini bagus! Ketika saya menjalankannya saya sampai execution error: System Events got an error: osascript is not allowed assistive access.di baris perintah. Cara termudah yang saya temukan untuk mengatasinya adalah dengan menempelkan kode AppleScript ke aplikasi Script Editor dan menjalankannya dari sana.
Evan

AppleScripts tidak berfungsi pada 10.10.5
oarfish

1
Ini bekerja untuk saya di bawah OS X El Capitan 10.11.6. Pastikan untuk tidak menyalin karakter terakhir (backtick) dari skrip. The osascript is not allowed assistive accesskesalahan dapat dihindari dengan memungkinkan aplikasi Terminal Anda di System Preferences => Keamanan & Privasi => Aksesibilitas.
neon1

Ini tidak berfungsi pada Mojave. TerimaWithCreds hanya selesai, tanpa melakukan apa pun.
oarfish

4

@ MichaelStoner jawaban adalah awal yang baik, tetapi gagal pada OS X 10.10.3 Yosemite, dengan pelaporan kode AppleScript-nya System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Setelah bermain-main sedikit, solusi berikut ini bekerja untuk saya:

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

Anda harus mengklik pada dialog "Izinkan" setelah memulai ini. Kode ini akan memakan waktu cukup lama, tetapi saya menyarankan agar tidak menurunkan penundaan ("delay 0.2" membuat saya memaksa-matikan Mac saya). Dapatkan secangkir kopi.


1
Ruang -> keystroke "" hanya berfungsi jika Anda memiliki System Preferences -> Keyboard Preferences -> Shortcuts tab, opsi bawah "Full Keyboard Access" dan kemudian pilih "Semua kontrol"
MichaelStoner

3

Fungsi Ekspor Keychain adalah untuk ITEM, bukan untuk keseluruhan keychain. Ini juga tidak akan membiarkan Anda mengekspor sebagian besar Item-yaitu ketika Anda akan melihat fungsi Ekspor berwarna abu-abu.

Untuk menyalin gantungan kunci dari satu mac ke yang lain gunakan aplikasi Migration Assistant .

Atau lakukan secara manual dengan menyalin file gantungan kunci yang terdapat di folder ~ / Library / Keychains /.

Buka aplikasi Keychain Access di komputer baru dan pilih File> Add Keychain….


1
terima kasih, Tapi aku bilang "ke OS lain" ... aku ingin meninggalkan OS X ...
Maïeul

Terima kasih telah mengedit dan menjelaskan. OS lainnya menyesatkan. Jadi Anda menginginkannya sebagai file teks (CSV)?
Ruskes

1
ya, csv sementara ok ...
Maïeul

1

The securitybiner akan mengambil barang-barang dari keychain dari baris perintah, sehingga Anda bisa script yang di python untuk membuang isi sistematis. Itu benar-benar tergantung pada format apa yang Anda inginkan data dan bagaimana Anda akan menggunakannya di masa depan.

Salin / tempel juga merupakan opsi yang layak jika Anda tahu berapa lama Anda ingin menerapkan solusi baru dan apakah Anda perlu mempelajari / mencari program atau pustaka yang ada yang akan membuang konten ke format yang Anda pilih.

Menu item ekspor adalah untuk ekspor kunci publik dan / atau swasta yang format file standar industri untuk menyandikan dan melindungi data yang sesuai ketika disimpan ke sistem file untuk pertukaran dan transportasi. Fungsi itu didokumentasikan secara singkat dalam bantuan untuk Asisten Keychain.


Tidak ada cara lain selain naskah itu? Ok, saya akan melihat biner ini, tapi ... kebutuhan dasar yang begitu banyak, hanya untuk memiliki sesuatu seperti CSV ...
Maïeul

1
Jika Anda dapat mengedit posting Anda untuk menentukan apa OS baru dan bahwa cvs adalah format yang Anda suka, saya mungkin punya beberapa ide lagi untuk Anda. Seperti yang ditanyakan, ini sangat kabur ...
bmike

0

Ada alat panggilan KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .

Untuk mengekstrak Frasa Sandi / Akun / Pembayaran / Catatan Aman / PublicKey / PrivateKey / SymmetricKey / Sertifikat dan sebagainya dari Keychain dengan tenang.


2
Anda tidak boleh memasukkan tautan yang mengharuskan pengguna untuk membuat akun untuk melihat konten. Akan lebih baik jika Anda mengulangi konten tautan.
David Anderson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.