Anahtar zincirlerini dışa aktar


23

Bir Ubutun'a geçmek için, tüm şifremi, örneğin bir CSV dosyasına vermek istiyorum.

Anahtarlık Erişimi'nde dışa aktarma menüsünü buldum ancak erişimin kilidi açılmış olsa bile, devre dışı bırakılmış durumda.

Ne yapmalıyım?


Ayrıca bu soruya / cevaba bakın: apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

Yanıtlar:


18

Bu, yıllar önce nasıl yaptığımla ilgili , bu Yosemite 10.11.5 için şu komut dosyası güncellemesidir - ama test etmedim.

  1. Anahtarlıktaki her öğeyi metne kaydeden bir komut dosyası:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. İkinci komut dosyasının KeyChain'den öğeyi okurken tetiklediği "İzin Ver" düğmesini tıklatan ikinci bir AppleScript öğesi.

    [Düzenleme: Temmuz 2016] Bazıları Mac'lerini 0.2 gecikmeyle kapattığını bildirdiği için bu not 10.11.5'e güncellendi, bu komut dosyasını bir seferde yalnızca 200 sonuç işleme koyacak şekilde sınırlandırdım, böylece 1050 anahtarlık öğeniz varsa , bu komut dosyasını ScriptEditor'da 6 kez çalıştırmanız gerekir; ayrıca güvenlik tercihlerindeki Erişilebilirlik bölümünde ScriptEditor'un etkinleştirilmesine izin vermeniz gerekir:

    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
    

Daha sonra yukarıdaki link / yosemite güncellemesi aynı zamanda metin dosyasından CSV'ye, yakışmışlar!

ShreevatsaR, bu yakut dönüşümünün "uygulama şifrelerini" değil, sadece "internet şifrelerini" kapsadığını belirtti. Bu komut dosyası amacı, "internet şifreleri" uygulamasına ihraç etmektir 1Password.

Ve burada bir yığın taşması sorusu ve aynı satırlar boyunca cevap

System.keychain burada:

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

AppleScript'in iletişim kutusuyla etkileşime girmesini sağlamak için Sistem Tercihleri ​​-> Güvenlik ve Gizlilik Tercihleri ​​-> Gizlilik Sekmesi, Erişilebilirlik Seçeneğinde "Script Editor.app" etkin olmalı Sistem Tercihleri ​​-> Güvenlik ve Gizlilik Tercihleri ​​-> Gizlilik Sekmesi, Erişilebilirlik Seçeneği vurgulanır


Size çok teşekkür ederim! İş iyi. System.keychain'imi neden dışa aktaramadığımı bilmiyorum. Ancak çoğu anahtarlık login.keychain üzerinde de var.
Maïeul,

Bu anahtarlık öğesi yolu güncellemesine bakın, ancak her bir öğe için kullanıcı adı ve parola isteyebilir; bu, sağlamak için izin verilen komut dosyası olarak değiştirilebilir.
MichaelStoner

Düşünüyor. AppleScript'te yetkim yok. Bu anahtarlıkta birkaç şifreniz var, bu yüzden ana şifremi birçok kez yazacağım.
Maïeul,

Çıktı alamazsanız, komutu anahtarlık ile aynı dizinde çalıştırmayı deneyin.
Rok Strniša

6
AppleScript benim için OS X 10.10.3'te işe yaramadı Yosemite, "Sistem Olayları bir hata aldı: \" SecurityAgent \ "işleminin 1. penceresinin 1. grubunu alamıyor. Geçersiz dizin".
Marcel Waldvogel

8

Anahtarlık dökümünü bir Excel dosyasına dönüştüren ve seninle paylaştığımı düşündüğüm bir python betiği yazdım. Excel'i CSV veya TSV üzerinden seçiyorum, çünkü birçok insan yüklüdür ve sadece dosyayı çift tıklatarak çalışır. Elbette, başka bir formatı basmak için betiği değiştirebilirsiniz. Bunu OS X 10.11 El Capitan'da yaptım, ancak eski işletim sistemlerinde de çalışmalıyım.

  1. Şifrelerimi düz metin olarak sabit sürücüme kaydetmeyi sevmediğim için, Disk Utility uygulamasını kullanarak şifreli bir kap oluşturdum. Basitçe Disk Yardımcı Programını açın ( cmd+ tuşlarına basın Space, "disk" yazın). Uygulamada, yeni resim için cmd+ tuşuna basın N, adı SEC olarak değiştirin, şifrelemeyi 256 Bit AES olarak değiştirin ve istediğiniz dizinde SEC altında saklayın. Ardından birimi dosyaya çift tıklayarak (veya Disk Yardımcı Programını kullanarak) bağlayın.

  2. Güvenli kapta keychain.py adlı yeni bir dosya oluşturun ve aşağıdaki kodu yapıştırın.

  3. Şimdi Terminal.app'i açın ve dizini monte edilmiş şifreli birime değiştirin: cd /Volumes/SEC

  4. Excel modülünü kurmak için python paket yöneticisine ihtiyacımız var (şifreniz istenecektir): sudo easy_install pip

  5. Python Excel modülünü kurmamız gerekiyor: sudo pip install xlwt

  6. Şimdi bu sorunun diğer cevaplarından birini kullanarak şifreleri dışa aktarın. Ben sadece yaptım security dump-keychain -d > keychain.txtve spam, fareyi diğer elimle tutarken İzin Ver düğmesine tıkladım.

  7. Son adım, txt dosyasını python betiğini kullanarak okunabilir bir Excel sayfasına dönüştürmektir: 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])

Vay, bu gerçekten çok ayrıntılı görünüyor. Ben ... Ben hala güvenli notları ve uygulama şifreleri için bir çözüm gerek bile, denemek için gidiyorum :( Bu bana uzun bir yol olsa iyi olur.
hepcat72

Güvenli notların bu mükemmel
çöküşünü buldum

Şimdi sadece gömülü bir görüntü içeren bir rtfd'nin dışa aktarmasının nasıl oluşturulacağını bulmaya ihtiyacım var. Ekran kapaklarında şifreli birkaç notum var.
hepcat72

Buna müthiş bir ek, artı bir ve thx
ehime

5

OSX 10.10.3'ten itibaren otomatik kabul etmenin yeni bir yolu var (yükseltme yolu sırasında sorunla karşılaştım)

Bash fonksiyonları ( dosyalara .profileveya .bash_rcdosyalara eklendi )

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

Ve anahtar kelimenizi atmak için bu betiği kullanın ( 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

Bu harika! Koştuğumda execution error: System Events got an error: osascript is not allowed assistive access.komut satırında oldum . Bununla başa çıkmanın en kolay yolu, AppleScript kodunu Komut Dosyası Düzenleyici uygulamasına yapıştırmak ve oradan çalıştırmaktı.
Evan

AppleScripts 10.10.5 üzerinde çalışmıyor
oarfish 12

1
Bu benim için OS X El Capitan 10.11.6 altında çalıştı. Son karakteri (backtick) komut dosyasından kopyalamadığınızdan emin olun. osascript is not allowed assistive accessTerminal uygulamanızın Sistem Tercihleri ​​=> Güvenlik ve Gizlilik => Erişilebilirlik kısmına izin verilmesiyle bu hata önlenebilir.
neon1 17:16

Bu Mojave üzerinde çalışmıyor. AcceptWithCreds hiçbir şey yapmadan basitçe sona erer.
oarfish,

4

@ MichaelStoner'ın yanıtı iyi bir başlangıç, ancak AppleScript kod raporlamasıyla OS X 10.10.3 Yosemite'de başarısız oluyor System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Biraz oynadıktan sonra, aşağıdaki çözüm benim için çalıştı:

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

Bunu başlattıktan sonra "İzin Ver" iletişim kutusunu tıklamanız gerekecek. Bu kod biraz zaman alacaktır, ancak gecikmeyi azaltmamanı tavsiye ederim ("0.2 gecikme", Mac'imde zorlamamı sağladı). Sadece bir fincan kahve al.


1
Boşluk -> tuş vuruşu "" yalnızca Sistem Tercihleri ​​-> Klavye Tercihleri ​​-> Kısayollar sekmesi, alt seçeneği "Tam Klavye Erişimi" ve ardından "Tüm denetimler" i seçtiyseniz çalışır
MichaelStoner

3

Anahtarlık Dışa Aktarma işlevi, tüm anahtarlığa yönelik değil ITEMS içindir. Ayrıca öğelerin çoğunu dışa aktarmanıza da izin vermez - o zaman grileştirilmiş Dışa Aktar işlevini görürsünüz.

Anahtarlık bir mactan diğerine kopyalamak için Migration Assistant uygulamasını kullanın .

Veya ~ / Library / Keychains / klasöründe bulunan anahtarlık dosyasını kopyalayarak el ile yapın.

Yeni bilgisayardaki Anahtarlık Erişimi uygulamasını açın ve File> seçeneğini belirleyin Add Keychain….


1
teşekkürler, Ama ben "başka bir işletim sistemine" dedim ... OS X'den ayrılmak istiyorum ...
Maïeul

Düzenleme ve netlik için teşekkür ederiz. Diğer işletim sistemi yanıltıcıydı. Öyleyse onu bir metin dosyası olarak mı istiyorsun (CSV)?
Ruskes

1
evet, bir csv olurken tamam ...
Maïeul

1

securityİkili, komut satırından keychain'inizden öğeleri alır böylece olabilir komut dosyası piton o sistematik içindekileri dökmek için. Bu gerçekten istediğiniz veri formatına ve onu nasıl kullanacağınıza bağlı.

Kopyala / yapıştır, yeni bir çözüm uygulamak için ne kadar zamana önem verdiğinizi ve içeriği seçtiğiniz biçime aktaracak varolan bir programı veya kitaplığı öğrenmeniz / aramanız gerekip gerekmediğini biliyorsanız iyi bir seçenektir.

İhracat öğeleri menüsü, veri alışverişinde ve aktarmada dosya sistemine depolandığında uygun şekilde verileri kodlamak ve korumak için endüstri standardı dosya formatlarının bulunduğu genel ve / veya özel anahtar ihracatına yöneliktir. Bu fonksiyon, Anahtarlık Asistanlığı yardımı ile kısaca belgelenmiştir.


Senaryodan başka bir yol yok mu? Tamam, bu
ikiliye

1
Yeni işletim sisteminizi ve bu cvs'nin istediğiniz bir format olduğunu belirtmek için postanızı düzenleyebilirsiniz, muhtemelen sizin için daha fazla fikrim olur.
İstediği

0

KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 adlı bir araç çağrısı var .

Parola / Hesap / Ödeme / Güvenli Not / PublicKey / PrivateKey / SymmetricKey / Sertifika vb.


2
İçeriği görebilmek için kullanıcının hesap oluşturmasını gerektiren bağlantılar eklememelisiniz. Bağlantının içeriğini yeniden bildirirseniz daha iyi olur.
David Anderson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.