키 체인 내보내기


23

Ubutun으로 마이그레이션하기 위해 모든 비밀번호 (예 : CSV 파일)를 내보내려고합니다.

Keychain Access에서 내보내기 메뉴를 찾았지만 액세스가 잠금 해제되어 있어도 항상 비활성화되어 있습니다.

어떻게해야합니까?


이 질문 / 응답도 참조하십시오 : apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

답변:


18

이것은 단지에 관한 방법 나는 몇 년 전에 그것을했다,이에 대한 해당 스크립트 업데이트입니다 요세미티 10.11.5 -하지만 난 그것을 테스트하지했습니다.

  1. 키 체인의 각 항목을 텍스트로 저장하는 스크립트 :

    security dump-keychain -d login.keychain > keychain.txt
    
  2. KeyChain에서 항목을 읽을 때 첫 번째 스크립트가 트리거하는 "허용"버튼을 클릭하는 두 번째 AppleScript 항목입니다.

    [편집 : 2016 년 7 월] 일부 사용자는 0.2 지연으로 Mac을 잠그는 것으로보고되어 10.11.5로 업데이트되었습니다. 한 번에 200 개의 결과 만 처리하도록 스크립트를 제한했습니다. 따라서 1050 개의 키 체인 항목이있는 경우 ScriptEditor에서이 스크립트를 6 번 실행해야합니다. 보안 기본 설정의 접근성 섹션에서 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

출력이 없으면 키 체인과 동일한 디렉토리에서 명령을 실행하십시오.
Rok Strniša

6
"시스템 이벤트에 오류가 발생했습니다 : \"SecurityAgent \ "프로세스의 창 1에서 그룹 1을 가져올 수 없습니다. 잘못된 인덱스"라고 주장하면서 OS X 10.10.3 Yosemite에서 AppleScript가 작동하지 않았습니다.
Marcel Waldvogel

8

키 체인 덤프를 Excel 파일로 변환하는 파이썬 스크립트를 작성했으며이를 공유한다고 생각했습니다. 많은 사람들이 설치하고 파일을 두 번 클릭하면 작동하기 때문에 CSV 또는 TSV보다 Excel을 선택합니다. 물론 다른 형식을 인쇄하도록 스크립트를 수정할 수도 있습니다. OS X 10.11 El Capitan 에서이 작업을 수행했지만 이전 OS에서도 작동해야합니다.

  1. 하드 드라이브에 암호 일반 텍스트를 저장하는 것을 좋아하지 않기 때문에 Disk Utility 앱을 사용하여 암호화 된 컨테이너를 만들었습니다. 디스크 유틸리티를 열기 만하면됩니다 ( cmd+를 누르고 Space"disk"를 입력하십시오). 앱에서 새 이미지를 보려면 cmd+ N를 누르고 이름을 SEC로 변경하고 암호화를 256 비트 AES로 변경 한 다음 SEC 아래에 선택한 디렉토리에 저장하십시오. 그런 다음 파일을 두 번 클릭하거나 디스크 유틸리티를 사용하여 볼륨을 마운트하십시오.

  2. 보안 컨테이너에 keychain.py라는 새 파일을 만들고 아래 코드를 붙여 넣습니다.

  3. 이제 Terminal.app을 열고 마운트 된 암호화 된 볼륨으로 디렉토리를 변경하십시오. cd /Volumes/SEC

  4. Excel 모듈을 설치하려면 Python 패키지 관리자가 필요합니다 (암호를 묻는 메시지가 표시됨). sudo easy_install pip

  5. Python Excel 모듈을 설치해야합니다. sudo pip install xlwt

  6. 이제이 질문에 대한 다른 답변 중 하나를 사용하여 비밀번호를 내보내십시오. 방금 security dump-keychain -d > keychain.txt마우스를 잡고 다른 손으로 마우스를 잡고있는 상태에서 허용 버튼을 클릭했습니다.

  7. 마지막 단계는 python 스크립트를 사용하여 txt 파일을 읽을 수있는 Excel 시트로 변환하는 것입니다. 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

이것에 멋진 추가, 그리고 하나와 thx
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 코드를 스크립트 편집기 앱에 붙여 넣은 것입니다.
Evan

10.10.5에서 작동하지 않는 AppleScript
oarfish

1
이것은 OS X El Capitan 10.11.6에서 나를 위해 일했습니다. 스크립트에서 마지막 문자 (백틱)를 복사하지 마십시오. osascript is not allowed assistive access오류가 시스템 환경 설정에서 터미널 응용 프로그램을 허용함으로써 피할 수있다 => 보안 및 개인 정보 보호 => 접근성.
neon1

모하비에서는 작동하지 않습니다. AcceptWithCreds는 아무 것도하지 않고 간단하게 완료됩니다.
금붕어

4

@MichaelStoner의 대답은 좋은 출발이지만 AppleScript 코드보고와 함께 OS X 10.10.3 Yosemite에서는 실패합니다 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

시작한 후에 "허용"대화창을 클릭해야합니다. 이 코드는 다소 시간이 걸리지 만 지연을 낮추지 않는 것이 좋습니다 ( "Delay 0.2"로 인해 Mac의 전원이 꺼졌습니다). 커피 한 잔만 마시세요.


1
공백-> 키 입력 ""은 시스템 환경 설정-> 키보드 환경 설정-> 바로 가기 탭과 하단 옵션 "전체 키보드 액세스"가 있고 "모든 컨트롤"을 선택한 경우에만 작동합니다.
MichaelStoner

3

키 체인 내보내기 기능은 전체 키 체인이 아닌 ITEMS 용입니다. 또한 대부분의 항목을 내보낼 수 없습니다. 즉, 회색으로 표시된 내보내기 기능이 표시됩니다.

한 Mac에서 다른 Mac으로 키 체인을 복사하려면 Migration Assistant 앱을 사용하십시오.

또는 ~ / Library / Keychains / 폴더에있는 키 체인 파일을 복사하여 수동으로 수행하십시오.

새 컴퓨터 에서 키 체인 접근 앱을 열고 File>를 선택하십시오 Add Keychain….


1
고마워,하지만 나는 "다른 OS에게"말했다 ... OS X를 떠나고 싶다 ...
Maïeul

편집하고 명확하게 해 주셔서 감사합니다. 다른 OS는 오도했다. 텍스트 파일 (CSV)로 사용 하시겠습니까?
Ruskes

1
그래, csv는 괜찮을 동안 ...
Maïeul

1

security이진, 명령 줄에서 키 체인에서 항목을 검색합니다 그래서 당신은 수있는 스크립트를 파이썬에 있음을 체계적으로 내용을 덤프 할 수 있습니다. 데이터를 원하는 형식과 향후 사용 방법에 따라 다릅니다.

복사 / 붙여 넣기는 새로운 솔루션을 구현하는 데 얼마나 오래 걸리는지, 그리고 선택한 형식으로 내용을 덤프 할 기존 프로그램이나 라이브러리를 배우거나 검색해야하는지 여부를 알고 있다면 적절한 옵션입니다.

내보내기 항목 메뉴는 교환 및 전송을 위해 파일 시스템에 저장 될 때 데이터를 적절하게 인코딩하고 보호하는 산업 표준 파일 형식이있는 공개 및 / 또는 개인 키 내보내기 용입니다. 이 기능은 Keychain Assistant 도움말에 간략하게 설명되어 있습니다.


스크립트 이외의 다른 방법은 없습니다? 좋아, 나는이 바이너리를 살펴볼 것이다.하지만 ... CSV와 같은 것을 갖기 위해서는 너무 많은 기본적 필요가있다.
Maïeul

1
게시물을 편집하여 새로운 OS와 해당 cvs가 원하는 형식을 지정할 수 있다면 더 많은 아이디어가있을 것입니다. 요청대로, 그것은 매우 모호합니다 ...
bmike

0

도구 호출 KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486이 있습니다.

키 체인에서 암호문 / 계정 / 지불 / 보안 메모 / 공개 키 / 개인 키 / SymmetricKey / 인증서 등을 추출합니다.


2
콘텐츠를보기 위해 사용자가 계정을 만들어야하는 링크를 삽입해서는 안됩니다. 링크의 내용을 다시 작성하면 더 좋습니다.
David Anderson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.