キーチェーンをエクスポートする


23

Ubutunに移行するために、すべてのパスワードを、たとえばCSVファイルにエクスポートしたいと思います。

キーチェーンアクセスでは、エクスポートメニューが見つかりましたが、アクセスがロック解除されている場合でも常に無効になっています。

私は何をすべきか?


こちらの質問/回答もご覧ください:apple.stackexchange.com/a/185980/129823
Marcel Waldvogel

回答:


18

これはちょうど約されてどのように私は何年も前にそれをやった、これがために、そのスクリプトの更新であるヨセミテ10.11.5 -しかし、私はそれをテストしていませんでした。

  1. キーチェーン内の各アイテムをテキストに保存するスクリプト:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. KeyChainから項目を読み取るときに最初のスクリプトがトリガーする「許可」ボタンをクリックする2番目のAppleScript項目。

    [編集:2016年7月] 10.11.5に更新され、0.2の遅延でMacがロックされると報告された人がいるため、一度に200の結果しか処理できないようにスクリプトを制限しました。 、ScriptEditorでこのスクリプトを6回実行する必要があります。また、セキュリティ設定のAccessibilityセクションで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にもあります。
マイウル14

そのキーチェーンアイテムパスの更新を参照してください。ただし、各アイテムのユーザー名とパスワードを要求される場合があります。これは、許可スクリプトを変更して提供することができます。
MichaelStoner 14

考えています。AppleScriptの能力はありません。このキーチェーンにはパスワードがほとんどないため、メインパスワードを何度も入力します。
マイウル14

出力が得られない場合は、キーチェーンと同じディレクトリ内でコマンドを実行してみてください。
ロックStrniša14年

6
OS X 10.10.3 YosemiteでAppleScriptが機能せず、「システムイベントにエラーが発生しました。プロセス\ "SecurityAgent \"のウィンドウ1のグループ1を取得できません。無効なインデックスです」。
マルセル・ヴァルトフォーゲル

8

キーチェーンダンプをExcelファイルに変換するPythonスクリプトを作成し、それを共有すると思いました。多くの人がそれをインストールしていて、ファイルをダブルクリックするだけで機能するため、CSVまたはTSVよりもExcelを選択します。もちろん、スクリプトを変更して他の形式を印刷することもできます。OS X 10.11 El Capitanでこれを行いましたが、古いOSでも動作するはずです。

  1. パスワードをプレーンテキストでハードドライブに保存するのは好きではないので、ディスクユーティリティアプリを使用して暗号化されたコンテナーを作成しました。ディスクユーティリティを開くだけです(cmd+を押しSpace、「ディスク」と入力します)。アプリで、新しい画像の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. 次に、この質問に対する他の回答の1つを使用してパスワードをエクスポートします。私がやったばかり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

これに素晴らしい追加、プラス1とthx

5

OSX 10.10.3の時点で、自動承認を行う新しい方法があります(アップグレードパスで問題が発生しました)

Bash関数(.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アプリに貼り付けて、そこから実行することでした。
エヴァン

10.10.5上で動作していないのAppleScript
oarfish

1
これは、OS X El Capitan 10.11.6で動作しました。スクリプトから最後の文字(バックティック)をコピーしないようにしてください。osascript is not allowed assistive accessエラーは、システム環境設定のご末端APP =>セキュリティ&プライバシー=>アクセシビリティできるようにすることで回避できます。
neon1

これはMojaveでは機能しません。AcceptWithCredsは何もせずに終了します。
oarfish

4

@MichaelStonerの答えは良いスタートですが、OS X 10.10.3 Yosemiteでは失敗し、AppleScriptコードが報告され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

キーチェーンのエクスポート機能は、キーチェーン全体ではなく、ITEMS用です。また、ほとんどのアイテムをエクスポートできません。つまり、グレー表示されたエクスポート機能が表示されます。

あるMacから別のMacにキーチェーンをコピーするには、Migration Assistantアプリを使用します。

または、〜/ Library / Keychains /フォルダーにあるキーチェーンファイルをコピーして手動で実行します。

新しいコンピューターでキーチェーンアクセスアプリを開き、File> を選択しますAdd Keychain…


1
おかげで、しかし、私は「他のOSに」...私は... OS Xを残したいと述べた
Maïeul

編集と明確化をありがとう。他のOSは誤解を招くものでした。では、テキストファイル(CSV)として必要ですか?
ラスケ14

1
はい、しばらくCSVは...大丈夫
Maïeul

1

securityバイナリは、コマンドラインからキーチェーンから項目を取得しますので、あなたは可能性がスクリプトをPythonでいることを体系的に内容をダンプします。それは、データをどのフォーマットにしたいか、今後どのように使用するかに大きく依存します。

コピー/貼り付けは、新しいソリューションを実装するのにどれだけの時間がかかり、コンテンツを選択した形式にダンプする既存のプログラムまたはライブラリを学習/検索する必要があるかを知っている場合にも適切なオプションです。

エクスポートアイテムメニューは、交換および転送のためにファイルシステムに保存する際に必要に応じてデータをエンコードおよび保護する業界標準のファイル形式がある公開キーおよび/または秘密キーのエクスポート用です。この機能は、キーチェーンアシスタントのヘルプに簡単に記載されています。


スクリプトを作成する以外に方法はありませんか?[OK]を、私はちょうど... CSVのようなものを持っているために、非常に多くの基本的な必要性...このバイナリに見えるだろうが
Maïeul

1
投稿を編集して新しいOSを指定し、そのcvsが好きな形式である場合、私はあなたのためにさらにいくつかのアイデアを持っているでしょう。尋ねたとして、それは...非常にあいまいである
bmike

0

KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486を呼び出すツールがあります

サイレントモードでキーチェーンからパスフレーズ/アカウント/支払い/セキュアノート/ PublicKey / PrivateKey / SymmetricKey / Certificateなどを抽出します。


2
コンテンツを表示するためにユーザーがアカウントを作成する必要があるリンクを挿入しないでください。リンクの内容を言い換えるとよいでしょう。
デビッドアンダーソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.