Móc khóa xuất khẩu


23

để di chuyển sang Ubutun, tôi muốn xuất tất cả mật khẩu của mình, ví dụ như tệp CSV.

Trong Keychain Access, tôi đã tìm thấy menu xuất, nhưng nó luôn bị vô hiệu hóa, ngay cả khi quyền truy cập được mở khóa.

Tôi nên làm gì?


Xem thêm câu hỏi / câu trả lời này: apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

Câu trả lời:


18

Đây chỉ là cách tôi đã làm nó nhiều năm trước, đây là bản cập nhật kịch bản cho Yosemite 10.11.5 - nhưng tôi đã không thử nghiệm nó.

  1. Một tập lệnh lưu từng mục trong Keychain thành văn bản:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Mục AppleScript thứ hai nhấp vào nút "Cho phép" mà tập lệnh thứ nhất kích hoạt khi đọc mục đó ra khỏi KeyChain.

    [Chỉnh sửa: Tháng 7 năm 2016] Điều này đã được cập nhật lên 10.11.5 lưu ý vì một số người đã báo cáo việc khóa máy Mac của họ với độ trễ 0,2, tôi đã giới hạn tập lệnh chỉ xử lý 200 kết quả cùng một lúc, do đó, nếu bạn có 1050 mục móc khóa , bạn sẽ cần chạy tập lệnh này 6 lần trong ScriptEditor, bạn cũng sẽ phải cho phép ScriptEditor được bật trong phần Trợ năng trong tùy chọn bảo mật trong:

    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
    

Sau đó, cập nhật liên kết / yosemite ở trên cũng có bước chuyển đổi ruby ​​từ tệp văn bản sang CSV, Chúc may mắn!

ShreevatsaR chỉ ra trong các ý kiến ​​rằng việc chuyển đổi ruby ​​này chỉ bao gồm "mật khẩu internet" chứ không phải "mật khẩu ứng dụng". Điều này là do mục đích của kịch bản là xuất "mật khẩu internet" vào ứng dụng 1Password.

Và đây là một câu hỏi tràn chồng và trả lời cùng một dòng

System.keychain có ở đây:

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

Để cho phép AppleScript tương tác với hộp thoại, Tùy chọn hệ thống -> Tùy chọn bảo mật & quyền riêng tư -> Tab riêng tư, Tùy chọn trợ năng phải được bật "Script Editor.app" Tùy chọn hệ thống -> Tùy chọn bảo mật & quyền riêng tư -> Tab riêng tư, tùy chọn trợ năng được tô sáng


cảm ơn bạn rất nhiều! Nó hoạt động tốt. Tôi chỉ không biết tại sao tôi không thể xuất System.keychain của mình. Nhưng hầu hết các móc khóa cũng có trên login.keychain.
Maïeul

Xem cập nhật cho đường dẫn mục móc khóa đó, nhưng nó có thể yêu cầu tên người dùng và mật khẩu cho từng mục, có thể là tập lệnh Cho phép có thể được sửa đổi để cung cấp.
MichaelStoner

Suy nghĩ. Tôi không có năng lực trong AppleScript. Tôi có một vài mật khẩu trong móc khóa này, vì vậy tôi sẽ gõ mật khẩu chính của mình nhiều lần.
Maïeul

Nếu bạn không nhận được đầu ra, hãy thử chạy lệnh trong cùng thư mục với móc khóa.
Rok Strniša

6
AppleScript không hoạt động với tôi trên OS X 10.10.3 Yosemite, tuyên bố "Sự kiện hệ thống bị lỗi: Không thể lấy nhóm 1 của cửa sổ 1 của tiến trình \" SecurityAgent \ ". Chỉ mục không hợp lệ".
Marcel Waldvogel

8

Tôi đã viết một tập lệnh python chuyển đổi kết xuất móc khóa thành tệp Excel và nghĩ rằng tôi chia sẻ nó với bạn. Tôi chọn Excel trên CSV hoặc TSV vì nhiều người đã cài đặt nó và nó chỉ hoạt động bằng cách nhấp đúp vào tệp. Tất nhiên bạn có thể sửa đổi tập lệnh để in bất kỳ định dạng nào khác. Tôi đã làm điều này trên OS X 10.11 El Capitan, nhưng cũng nên hoạt động trên hệ điều hành cũ hơn '.

  1. Vì tôi không thích lưu trữ mật khẩu của mình trên ổ cứng, tôi đã tạo một thùng chứa được mã hóa bằng ứng dụng Disk Utility. Chỉ cần mở Disk Utility (nhấn cmd+ Space, gõ "đĩa"). Trong ứng dụng, nhấn cmd+ Ncho hình ảnh mới, thay đổi tên thành SEC, thay đổi mã hóa thành AES 256-bit và lưu nó dưới SEC trong một thư mục bạn chọn. Sau đó gắn kết âm lượng bằng cách nhân đôi trên tệp (hoặc sử dụng Disk Utility).

  2. Tạo một tệp mới có tên là móc khóa trong bộ chứa an toàn và dán mã bên dưới.

  3. Bây giờ hãy mở Terminal.app và thay đổi thư mục thành ổ đĩa được mã hóa: cd /Volumes/SEC

  4. Chúng tôi cần trình quản lý gói python để cài đặt mô-đun Excel (bạn sẽ được nhắc nhập mật khẩu): sudo easy_install pip

  5. Chúng ta cần cài đặt mô-đun Python Excel: sudo pip install xlwt

  6. Bây giờ xuất mật khẩu bằng một trong những câu trả lời khác cho câu hỏi này. Tôi vừa làm security dump-keychain -d > keychain.txtvà spam nhấp vào nút Cho phép trong khi giữ chuột bằng tay kia.

  7. Bước cuối cùng là chuyển đổi tệp txt thành bảng Excel có thể đọc được bằng cách sử dụng tập lệnh 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, điều này có vẻ thực sự kỹ lưỡng. Tôi sẽ cho nó một shot, mặc dù tôi vẫn cần một giải pháp cho các ghi chú an toàn và mật khẩu ứng dụng ... :( Điều này sẽ giúp tôi đi một chặng đường dài.
hepcat72

Đã tìm thấy bản phân tích tuyệt vời này của ghi chú an toàn: stackoverflow.com/questions/22370552/ trên
hepcat72

Bây giờ tôi chỉ cần tìm ra cách tạo một bản rtfd bao gồm một hình ảnh nhúng. Tôi có một vài lưu ý với mật khẩu trong mũ màn hình.
hepcat72

Bổ sung tuyệt vời cho điều này, cộng với một và thx
ehime

5

Kể từ OSX 10.10.3, có một cách mới để tự động chấp nhận (tôi gặp vấn đề trong quá trình nâng cấp)

Hàm Bash (được thêm vào một trong hai .profilehoặc .bash_rctệp)

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

Và sử dụng tập lệnh này để kết xuất keyring của bạ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

Điều đó thật tuyệt! Khi tôi chạy nó, tôi nhận được execution error: System Events got an error: osascript is not allowed assistive access.ở dòng lệnh. Cách dễ nhất tôi tìm thấy để giải quyết vấn đề này là dán mã AppleScript vào ứng dụng Script Editor và chạy nó từ đó.
Evan

AppleScripts không làm việc trên 10.10.5
cá oarfish

1
Điều này làm việc cho tôi theo OS X El Capitan 10.11.6. Đảm bảo không sao chép ký tự cuối cùng (backtick) từ tập lệnh. Có osascript is not allowed assistive accessthể tránh lỗi bằng cách cho phép ứng dụng Terminal của bạn trong System Preferences => Security & Privacy => Access.
neon1

Điều này không hoạt động trên Mojave. AcceptWithCreds chỉ đơn giản là kết thúc, mà không làm gì cả.
oarfish

4

Câu trả lời của @ MichaelStoner là một khởi đầu tốt, nhưng nó đã thất bại trên OS X 10.10.3 Yosemite, với báo cáo mã AppleScript của anh ấy System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Sau khi chơi xung quanh một chút, giải pháp sau đây có hiệu quả với tôi:

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

Bạn sẽ phải nhấp vào hộp thoại "Cho phép" sau khi bắt đầu việc này. Mã này sẽ mất một chút thời gian, nhưng tôi khuyên bạn không nên giảm độ trễ ("độ trễ 0,2" khiến tôi buộc phải tắt máy Mac). Chỉ cần lấy một tách cà phê.


1
Không gian -> tổ hợp phím "" chỉ hoạt động nếu bạn có Tùy chọn hệ thống -> Tùy chọn bàn phím -> tab Phím tắt, tùy chọn dưới cùng "Truy cập bàn phím đầy đủ" và sau đó chọn "Tất cả các điều khiển"
MichaelStoner

3

Chức năng Keychain Keychain dành cho ITEMS, không phải cho toàn bộ móc khóa. Nó cũng sẽ không cho phép bạn xuất hầu hết các Mục - đó là khi bạn sẽ thấy chức năng Xuất ra màu xám.

Để sao chép móc khóa từ máy Mac này sang máy khác, hãy sử dụng ứng dụng Trợ lý di chuyển .

Hoặc thực hiện thủ công bằng cách sao chép tệp chuỗi khóa nằm trong thư mục ~ / Library / Keychains /.

Mở ứng dụng Keychain Access trên máy tính mới và chọn File> Add Keychain….


1
cảm ơn, nhưng tôi đã nói "với một hệ điều hành khác" ... Tôi muốn rời khỏi OS X ...
Maïeul

Cảm ơn đã chỉnh sửa và rõ ràng. Các os khác đã gây hiểu nhầm. Vì vậy, bạn muốn nó như là một tệp văn bản sau đó (CSV)?
Ruskes

1
vâng, một csv trong khi vẫn ổn ...
Maïeul

1

Các securitynhị phân sẽ lấy các mục từ keychain từ dòng lệnh, vì vậy bạn có thể kịch bản mà trong python để đổ nội dung một cách hệ thống. Nó thực sự phụ thuộc vào định dạng bạn muốn dữ liệu và cách bạn sẽ sử dụng nó trong tương lai.

Sao chép / dán cũng là một lựa chọn hợp lý nếu bạn biết bạn quan tâm đến việc thực hiện một giải pháp mới trong bao lâu và liệu bạn có cần học / tìm kiếm một chương trình hoặc thư viện hiện có sẽ chuyển nội dung sang định dạng bạn đã chọn hay không.

Menu mục xuất là dành cho xuất công khai và / hoặc khóa riêng có các định dạng tệp tiêu chuẩn công nghiệp để mã hóa và bảo vệ dữ liệu khi thích hợp khi được lưu trữ vào hệ thống tệp để trao đổi và vận chuyển. Chức năng đó được ghi lại ngắn gọn trong trợ giúp cho Keychain Assistant.


Không có cách nào khác ngoài kịch bản đó? Ok, tôi sẽ xem xét nhị phân này, nhưng ... rất nhiều nhu cầu cơ bản, chỉ để có thứ gì đó như CSV ...
Maïeul

1
Nếu bạn có thể chỉnh sửa bài đăng của mình để chỉ định HĐH mới nào và cvs đó là định dạng bạn thích, tôi có thể có thêm một số ý tưởng cho bạn. Khi được hỏi, nó rất mơ hồ ...
bmike

0

Có một công cụ gọi KeychaindumpPro https://hackforums.net/showthread.php?tid=5804486 .

Để trích xuất Cụm mật khẩu / Tài khoản / Thanh toán / Ghi chú an toàn / PublicKey / PrivateKey / SymmetricKey / Chứng chỉ, v.v. từ Keychain trong im lặng.


2
Bạn không nên chèn các liên kết yêu cầu người dùng tạo tài khoản để xem nội dung. Sẽ tốt hơn nếu bạn đọc lại nội dung của liên kết.
David Anderson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.