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

23

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

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

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

Maïeul
источник
См. Также этот вопрос / ответ: 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». Системные настройки -> Настройки безопасности и конфиденциальности -> Вкладка «Конфиденциальность», выделена опция доступности

MichaelStoner
источник
большое спасибо! Это нормально работает. Я просто не знаю, почему я не могу экспортировать свой 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])
valyron
источник
Вау, это выглядит действительно тщательно. Я собираюсь дать ему шанс, хотя мне все еще нужно решение для защищенных заметок и паролей приложений ... :( Хотя это должно помочь мне пройти долгий путь.
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….

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

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

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

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

bmike
источник
Там нет другого способа, чем сценарий это? Хорошо, я посмотрю на этот двоичный файл, но ... так много основных потребностей, просто иметь что-то вроде CSV ...
Maïeul
1
Если вы можете отредактировать свой пост, чтобы указать, какая новая ОС и какой формат cvs вам нравится, у меня, возможно, будет еще несколько идей для вас. Как и спросили, это очень расплывчато ...
bmike
0

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

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

неизвестный
источник
2
Вы не должны вставлять ссылки, которые требуют, чтобы пользователь создал учетную запись для просмотра контента. Было бы лучше, если бы вы перефразировали содержание ссылки.
Дэвид Андерсон