พวงกุญแจส่งออก


23

เพื่อที่จะโยกย้ายไปยัง Ubutun ฉันต้องการส่งออกรหัสผ่านทั้งหมดของฉันไปยังไฟล์ CSV

ใน Keychain Access ฉันพบเมนูส่งออก แต่มันถูกปิดการใช้งานเสมอแม้ว่าจะปลดล็อคการเข้าถึงแล้วก็ตาม

ฉันควรทำอย่างไร?


ดูคำถาม / คำตอบนี้: apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

คำตอบ:


18

นี่เป็นเพียงวิธีที่ฉันทำเมื่อหลายปีก่อนนี่คือการอัปเดตสคริปต์สำหรับYosemite 10.11.5 - แต่ฉันไม่ได้ทำการทดสอบ

  1. สคริปต์ที่บันทึกแต่ละรายการใน Keychain เป็นข้อความ:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. รายการ AppleScript ที่สองที่คลิกที่ปุ่ม "อนุญาต" ที่สคริปต์ที่ 1 ทริกเกอร์เมื่ออ่านรายการจาก KeyChain

    [แก้ไข: กรกฎาคม 2559] สิ่งนี้ได้รับการอัปเดตเป็น 10.11.5 โน้ตเนื่องจากบางคนรายงานว่าการล็อก Mac ด้วยความล่าช้า 0.2 ครั้งฉันได้ จำกัด สคริปต์เพื่อประมวลผล 200 รายการต่อครั้งเท่านั้นดังนั้นหากคุณมีรายการพวงกุญแจ 1,050 รายการ คุณจะต้องเรียกใช้สคริปต์นี้ 6 ครั้งใน ScriptEditor คุณจะต้องอนุญาตให้ ScriptEditor เปิดใช้งานในส่วนการช่วยสำหรับการเข้าถึงในการตั้งค่าความปลอดภัยใน:

    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
    

จากนั้นการอัปเดตลิงก์ / โยเซมิตีด้านบนยังมีขั้นตอนการแปลงทับทิมจากไฟล์ข้อความเป็น CSV โชคดี!

ShreevatsaR ชี้ให้เห็นในความคิดเห็นว่าการแปลงทับทิมนี้ครอบคลุมเฉพาะ "รหัสผ่านอินเทอร์เน็ต" และไม่ใช่ "รหัสผ่านแอปพลิเคชัน" เพราะนี่คือจุดมุ่งหมายของสคริปต์คือการส่งออก "รหัสผ่านอินเทอร์เน็ต" 1Passwordลงในใบสมัคร

และนี่คือคำถามและคำตอบล้นสแต็กในบรรทัดเดียวกัน

System.keychain อยู่ที่นี่:

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

ในการเปิดใช้งาน AppleScript เพื่อโต้ตอบกับกล่องโต้ตอบการตั้งค่าระบบ -> การตั้งค่าความปลอดภัยและความเป็นส่วนตัว -> แท็บความเป็นส่วนตัวตัวเลือกการเข้าถึงต้องเปิดใช้งาน "Script Editor.app" การตั้งค่าระบบ -> การตั้งค่าความปลอดภัยและความเป็นส่วนตัว -> แท็บความเป็นส่วนตัวตัวเลือกการเข้าถึงที่เน้น


ขอบคุณมาก! มันใช้งานได้ดี ฉันไม่รู้ว่าทำไมฉันไม่สามารถส่งออก System.keychain ของฉัน แต่พวงกุญแจส่วนใหญ่ก็มีอยู่ใน login.keychain
Maïeul

ดูอัปเดตสำหรับเส้นทางรายการพวงกุญแจนั้น แต่อาจขอชื่อผู้ใช้และรหัสผ่านสำหรับแต่ละรายการซึ่งอาจเป็นสคริปต์อนุญาตให้สามารถแก้ไขเพื่อให้ได้
MichaelStoner

คิดว่า ฉันไม่มีความสามารถใน AppleScript ฉันมีรหัสผ่านไม่กี่ตัวในพวงกุญแจนี้ดังนั้นฉันจะพิมพ์รหัสผ่านหลักของฉันหลายครั้ง
Maïeul

หากคุณไม่มีเอาต์พุตให้ลองรันคำสั่งภายในไดเร็กทอรีเดียวกันกับ Keychain
Rok Strniša

6
AppleScript ไม่ทำงานสำหรับฉันบน OS X 10.10.3 โยเซมิตีโดยอ้างว่า "เหตุการณ์ระบบมีข้อผิดพลาด: ไม่สามารถรับกลุ่ม 1 ของหน้าต่าง 1 ของกระบวนการ \" SecurityAgent \ "ดัชนีไม่ถูกต้อง"
Marcel Waldvogel

8

ฉันเขียนสคริปต์ไพ ธ อนที่แปลงการถ่ายโอนพวงกุญแจเป็นไฟล์ Excel และคิดว่าฉันแบ่งปันกับคุณ ฉันเลือก Excel ในรูปแบบ CSV หรือ TSV เพราะมีคนจำนวนมากติดตั้งไว้และใช้งานได้โดยการดับเบิลคลิกที่ไฟล์ แน่นอนคุณอาจปรับเปลี่ยนสคริปต์เพื่อพิมพ์รูปแบบอื่น ๆ ฉันทำสิ่งนี้ใน OS X 10.11 El Capitan แต่ควรใช้กับ OS เก่ากว่าด้วย

  1. เนื่องจากฉันไม่ชอบการจัดเก็บรหัสผ่านของฉันไว้ในฮาร์ดไดรฟ์ฉันจึงสร้างที่เก็บที่เข้ารหัสโดยใช้แอพ Disk Utility เพียงเปิด Disk Utility (กดcmd+ Spaceพิมพ์ "disk") ในแอปให้กดcmd+ Nสำหรับภาพใหม่เปลี่ยนชื่อเป็น SEC เปลี่ยนการเข้ารหัสเป็น AES 256- บิตและบันทึกไว้ภายใต้ SEC ในไดเรกทอรีที่คุณเลือก จากนั้นติดตั้งไดรฟ์ข้อมูลโดยดับเบิลคลิกที่ไฟล์ (หรือใช้ Disk Utility)

  2. สร้างไฟล์ใหม่ชื่อ keychain.py ในคอนเทนเนอร์ที่ปลอดภัยและวางรหัสด้านล่าง

  3. ตอนนี้ให้เปิด Terminal.app และเปลี่ยนไดเรกทอรีเป็นไดรฟ์ข้อมูลที่เข้ารหัสแล้ว: cd /Volumes/SEC

  4. เราต้องการผู้จัดการแพ็คเกจงูใหญ่สำหรับการติดตั้งโมดูล Excel (คุณจะได้รับแจ้งให้ใส่รหัสผ่านของคุณ): sudo easy_install pip

  5. เราจำเป็นต้องติดตั้งโมดูล Python Excel: sudo pip install xlwt

  6. ตอนนี้ส่งออกรหัสผ่านโดยใช้หนึ่งในคำตอบของคำถามนี้ ฉันเพิ่งทำsecurity dump-keychain -d > keychain.txtและสแปมคลิกปุ่มอนุญาตในขณะที่จับเมาส์ด้วยมือของฉัน

  7. ขั้นตอนสุดท้ายคือการแปลงไฟล์ txt เป็นแผ่นงาน Excel ที่อ่านได้โดยใช้สคริปต์ 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])

ว้าวนี่มันดูทั่วถึงจริงๆ ฉันจะยิงมันถึงแม้ว่าฉันยังต้องการวิธีแก้ปัญหาสำหรับบันทึกย่อที่ปลอดภัยและรหัสผ่านแอป ... :( นี่ควรจะได้รับฉันไปไกลมาก
hepcat72

พบการทำลายที่ยอดเยี่ยมของโน้ตที่ปลอดภัย: stackoverflow.com/questions/22370552/…
hepcat72

ตอนนี้ฉันเพียงแค่ต้องคิดออกว่าจะสร้างการส่งออกของ rtfd ที่มีภาพที่ฝังอยู่ ฉันมีบันทึกย่อที่มีรหัสผ่านในตัวพิมพ์หน้าจอ
hepcat72

นอกจากนี้ที่ยอดเยี่ยมรวมทั้งหนึ่งและขอบคุณ
ehime

5

ตั้งแต่ OSX 10.10.3 มีวิธีใหม่ในการยอมรับอัตโนมัติ (ฉันพบปัญหาระหว่างเส้นทางการอัปเกรด)

ฟังก์ชั่นทุบตี (เพิ่มอย่างใดอย่างหนึ่ง.profileหรือ.bash_rcไฟล์)

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

และใช้สคริปต์นี้เพื่อทิ้งพวงกุญแจของคุณ ( 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.ที่บรรทัดคำสั่ง วิธีที่ง่ายที่สุดที่ฉันพบในการจัดการเรื่องนี้คือการวางรหัส AppleScript ลงในแอป Script Editor และเรียกใช้จากที่นั่น
Evan

AppleScripts ไม่ทำงานใน 10.10.5
ชาว

1
สิ่งนี้ใช้ได้กับฉันภายใต้ OS X El Capitan 10.11.6 อย่าคัดลอกอักขระตัวสุดท้าย (backtick) จากสคริปต์ osascript is not allowed assistive accessข้อผิดพลาดสามารถหลีกเลี่ยงได้โดยการอนุญาตให้แอปพลิเคเทอร์ของคุณได้ในการตั้งค่าระบบ => การรักษาความปลอดภัยและความเป็นส่วนตัว => ผู้พิการ
neon1

สิ่งนี้ใช้ไม่ได้กับโมฮาวี AcceptWithCreds ก็เสร็จสิ้นโดยไม่ต้องทำอะไรเลย
ปลาออร์

4

@ คำตอบ MichaelStoner เป็นจุดเริ่มต้นที่ดี แต่มันล้มเหลวใน OS X 10.10.3 System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid indexโยเซมิตีที่มีการรายงานรหัสของเขา

หลังจากเล่นไปสักระยะหนึ่งโซลูชันต่อไปนี้ใช้ได้กับฉัน:

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

คุณจะต้องคลิกที่กล่องโต้ตอบ "อนุญาต" หลังจากเริ่มต้นนี้ รหัสนี้จะใช้เวลาสักครู่ แต่ฉันแนะนำให้ลดการหน่วงเวลา ("ล่าช้า 0.2" ทำให้ฉันบังคับให้ปิดเครื่อง Mac ของฉัน) เพิ่งได้กาแฟหนึ่งแก้ว


1
ช่องว่าง -> การกดแป้น "" ใช้งานได้เฉพาะในกรณีที่คุณมีการตั้งค่าระบบ -> การตั้งค่าแป้นพิมพ์ -> แท็บทางลัดตัวเลือกด้านล่าง "การเข้าถึงแป้นพิมพ์เต็มรูปแบบ" จากนั้นเลือก "การควบคุมทั้งหมด"
MichaelStoner

3

ฟังก์ชั่นการส่งออกพวงกุญแจมีไว้สำหรับรายการไม่ใช่สำหรับพวงกุญแจทั้งหมด นอกจากนี้ยังไม่อนุญาตให้คุณส่งออกรายการส่วนใหญ่นั่นคือเมื่อคุณจะเห็นฟังก์ชั่นส่งออกเป็นสีเทา

ในการคัดลอกพวงกุญแจจากแม็คหนึ่งไปยังอีกแอปหนึ่งให้ใช้แอพMigration Assistant

หรือทำด้วยตนเองโดยการคัดลอกไฟล์พวงกุญแจที่อยู่ในโฟลเดอร์ ~ / Library / Keychains /

เปิดพวงกุญแจเข้าถึง app บนคอมพิวเตอร์เครื่องใหม่และเลือก>FileAdd Keychain…


1
ขอบคุณ แต่ฉันพูดว่า "กับระบบปฏิบัติการอื่น" ... ฉันต้องการออกจาก OS X ...
Ma --eul

ขอบคุณสำหรับการแก้ไขและความชัดเจน ระบบปฏิบัติการอื่น ๆ ทำให้เข้าใจผิด ดังนั้นคุณต้องการให้มันเป็นไฟล์ข้อความแล้ว (CSV)?
Ruskes

1
ใช่ CSV ในขณะที่จะ ok ...
Maïeul

1

securityไบนารีจะดึงรายการจากพวงกุญแจจากบรรทัดคำสั่งเพื่อให้คุณสามารถสคริปต์ที่ในหลามเพื่อถ่ายโอนข้อมูลเนื้อหาอย่างเป็นระบบ มันขึ้นอยู่กับรูปแบบที่คุณต้องการข้อมูลและวิธีที่คุณจะใช้มันในอนาคต

คัดลอก / วางยังเป็นตัวเลือกที่ดีถ้าคุณรู้ว่าคุณสนใจที่จะใช้โซลูชั่นใหม่นานแค่ไหนและไม่ว่าคุณจะต้องเรียนรู้ / ค้นหาโปรแกรมหรือไลบรารีที่มีอยู่ซึ่งจะถ่ายโอนเนื้อหาไปยังรูปแบบที่คุณเลือก

เมนูรายการส่งออกมีไว้สำหรับการส่งออกสาธารณะและ / หรือคีย์ส่วนตัวซึ่งมีรูปแบบไฟล์มาตรฐานอุตสาหกรรมเพื่อเข้ารหัสและปกป้องข้อมูลตามความเหมาะสมเมื่อเก็บไว้ในระบบไฟล์เพื่อแลกเปลี่ยนและขนส่ง ฟังก์ชั่นดังกล่าวได้รับการบันทึกไว้ในความช่วยเหลือสำหรับ Keychain Assistant


ไม่มีวิธีอื่นนอกจากสคริปต์หรือไม่ ตกลงฉันจะมองไปที่ไบนารีนี้ แต่ ... ความต้องการขั้นพื้นฐานจำนวนมากดังนั้นเพียงแค่มีบางสิ่งบางอย่างเช่นไฟล์ CSV ...
Maïeul

1
หากคุณสามารถแก้ไขโพสต์ของคุณเพื่อระบุระบบปฏิบัติการใหม่และ CV ที่เป็นรูปแบบที่คุณชอบฉันอาจมีแนวคิดเพิ่มเติมสำหรับคุณ ตามที่ถามไว้มันคลุมเครือมาก ...
bmike

0

มีการเรียกเครื่องมือเป็น KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486

สำหรับการแยกข้อความรหัสผ่าน / บัญชี / การชำระเงิน / หมายเหตุการรักษาความปลอดภัย / PublicKey / PrivateKey / SymmetricKey / ใบรับรองและอื่น ๆ จาก Keychain ในความเงียบ


2
คุณไม่ควรแทรกลิงค์ที่ต้องการให้ผู้ใช้สร้างบัญชีเพื่อดูเนื้อหา มันจะดีกว่าถ้าคุณใช้เนื้อหาของลิงก์ใหม่
David Anderson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.