Экспорт цепочек для ключей


23

чтобы перейти на Ubutun, я хотел бы экспортировать весь свой пароль, например, в файл CSV.

В Keychain Access я нашел меню экспорта, но оно всегда отключено, даже когда доступ разблокирован.

Что мне делать?


См. Также этот вопрос / ответ: apple.stackexchange.com/a/185980/129823
Марсель Вальдвогель

Ответы:


18

Это как раз то, как я это сделал много лет назад, это обновление скрипта для Yosemite 10.11.5 - но я его не тестировал.

  1. Скрипт, который сохраняет каждый элемент цепочки для ключей в текст:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Второй элемент AppleScript, который нажимает кнопку «Разрешить», которая запускается 1-м сценарием при считывании элемента из цепочки ключей.

    [Редактировать: июль 2016 года] Это было обновлено до примечания 10.11.5, так как некоторые сообщали о блокировке своего Mac с задержкой 0,2, я ограничил скрипт только обработкой 200 результатов за раз, таким образом, если у вас есть 1050 элементов цепочки для ключей вам нужно будет запустить этот скрипт 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
    

Затем вышеприведенное обновление для ссылки / yosemite также содержит шаг преобразования рубина из текстового файла в CSV. Удачи!

В комментариях ShreevatsaR указывает, что это преобразование в ruby ​​охватывает только «пароли интернета», а не «пароли приложений». Это связано с тем, что целью скрипта является экспорт «интернет-паролей» в приложение 1Password.

А вот вопрос переполнения стека и ответ в том же духе

System.keychain находится здесь:

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

Чтобы AppleScript мог взаимодействовать с диалоговым окном Системные настройки -> Параметры безопасности и конфиденциальности -> Вкладка «Конфиденциальность», в параметре специальных возможностей должен быть включен «Script Editor.app». Системные настройки -> Настройки безопасности и конфиденциальности -> Вкладка «Конфиденциальность», выделена опция доступности


большое спасибо! Это нормально работает. Я просто не знаю, почему я не могу экспортировать свой System.keychain. Но большинство брелков есть и на login.keychain.
Майюль

См. Обновление для этого пути элемента цепочки для ключей, но может потребоваться ввести имя пользователя и пароль для каждого элемента, который может быть изменен для предоставления сценария «Разрешить».
MichaelStoner

Думает. У меня нет компетенции в AppleScript. У меня всего несколько паролей в этой цепочке для ключей, поэтому я буду много раз вводить свой основной пароль.
Майюль

Если вы ничего не получили, попробуйте запустить команду в том же каталоге, что и цепочка для ключей.
Рок Стрниша

6
AppleScript не работал для меня на OS X 10.10.3 Yosemite, утверждая, что «Системные события получили ошибку: не удается получить группу 1 окна 1 процесса \« SecurityAgent \ ». Неверный индекс».
Марсель Вальдвогель

8

Я написал скрипт на python, который преобразует дамп цепочки для ключей в файл Excel, и решил поделиться им с вами. Я выбираю Excel вместо CSV или TSV, потому что у многих людей он установлен, и он просто работает, дважды щелкнув по файлу. Конечно, вы можете изменить скрипт для печати в любом другом формате. Я сделал это на OS X 10.11 El Capitan, но должен работать и на старых ОС ».

  1. Поскольку я не люблю хранить незашифрованные пароли на жестком диске, я создал зашифрованный контейнер с помощью приложения Disk Utility. Просто откройте Дисковую утилиту (нажмите cmd+ Space, введите «диск»). В приложении нажмите cmd+ Nдля нового изображения, измените имя на SEC, измените шифрование на 256-битный AES и сохраните его в SEC в выбранном вами каталоге. Затем подключите том, дважды щелкнув по файлу (или с помощью Дисковой утилиты).

  2. Создайте новый файл с именем keychain.py в безопасном контейнере и вставьте приведенный ниже код.

  3. Теперь откройте Terminal.app и измените каталог на подключенный зашифрованный том: cd /Volumes/SEC

  4. Нам нужен менеджер пакетов python для установки модуля Excel (вам будет предложено ввести пароль): sudo easy_install pip

  5. Нам нужно установить модуль Python Excel: sudo pip install xlwt

  6. Теперь экспортируйте пароли, используя один из ответов на этот вопрос. Я только что сделал security dump-keychain -d > keychain.txtи спам нажал на кнопку Разрешить, удерживая мышь другой рукой.

  7. Последний шаг - преобразовать текстовый файл в читаемый лист 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

Нашел этот превосходный
анализ

Теперь мне просто нужно выяснить, как создать экспорт rtfd, который включает встроенное изображение. У меня есть несколько заметок с паролями в шапках экрана.
hepcat72

Удивительное дополнение к этому, плюс один и thx
ehime

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 и запустить его оттуда.
Эван

AppleScripts не работает на 10.10.5
oarfish

1
Это работало для меня под OS X El Capitan 10.11.6. Убедитесь, что не скопировали последний символ (backtick) из сценария. Эту osascript is not allowed assistive accessошибку можно избежать, разрешив приложению «Терминал» в «Системные настройки» => «Безопасность и конфиденциальность» => «Доступность».
neon1

Это не работает на Мохаве. 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

Функция экспорта цепочки для ключей предназначена для ЭЛЕМЕНТОВ, а не для всей цепочки для ключей. Это также не позволит вам экспортировать большинство элементов, то есть когда вы увидите недоступную функцию экспорта.

Чтобы скопировать связку ключей с одного компьютера Mac на другой, используйте приложение Migration Assistant .

Или сделайте это вручную, скопировав файл цепочки ключей, расположенный в папке ~ / Library / Keychains /.

Откройте приложение Keychain Access на новом компьютере и выберите File> Add Keychain….


1
спасибо, но я сказал "другой ОС" ... я хочу оставить OS X ...
Maïeul

Спасибо за редактирование и ясность. Другая ОС вводила в заблуждение. Итак, вы хотите, чтобы это был текстовый файл (CSV)?
Рускес

1
да, CSV пока будет в порядке ...
Maïeul

1

securityДвоичный будет извлекать элементы из брелка из командной строки, так что вы могли бы сценарий , что в питоне , чтобы сбросить содержимое систематически. Это действительно зависит от того, в каком формате вам нужны данные и как вы будете их использовать в будущем.

Копирование / вставка также является хорошим вариантом, если вы знаете, как долго вы хотите внедрить новое решение и нужно ли вам изучать / искать существующую программу или библиотеку, которая будет выгружать содержимое в выбранный вами формат.

Меню элементов экспорта предназначено для экспорта с открытым и / или закрытым ключом, для которого существуют стандартные отраслевые форматы файлов, позволяющие одновременно кодировать и защищать данные при их сохранении в файловой системе для обмена и передачи. Эта функция кратко описана в справке для Помощника брелка.


Там нет другого способа, чем сценарий это? Хорошо, я посмотрю на этот двоичный файл, но ... так много основных потребностей, просто иметь что-то вроде CSV ...
Maïeul

1
Если вы можете отредактировать свой пост, чтобы указать, какая новая ОС и какой формат cvs вам нравится, у меня, возможно, будет еще несколько идей для вас. Как и спросили, это очень расплывчато ...
bmike

0

Есть инструментальный вызов KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .

Для извлечения парольной фразы / учетной записи / платежа / защищенной заметки / PublicKey / PrivateKey / SymmetricKey / Certificate и т. Д. Из цепочки для ключей в тишине.


2
Вы не должны вставлять ссылки, которые требуют, чтобы пользователь создал учетную запись для просмотра контента. Было бы лучше, если бы вы перефразировали содержание ссылки.
Дэвид Андерсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.